从Excel VBA脚本

时间:2017-10-22 18:50:04

标签: excel vba webforms

我正在尝试将大量文字发布到纳税提交表单上的特定字段中。总共有1000多个领域。在测试一些条目时,我的代码工作得很好。但是有几千行,当我尝试发布所有字段时,Excel给出了一个错误,指出“过程太大”。现在我试图使用变量清理代码。

以下是原始代码:

Sub Fill_Form()

Set IE = CreateObject("InternetExplorer.Application")
With IE
    .Visible = True
    .navigate URL:="https://ritx-fl-cst2.bswa.net/(S(2kgryl5f1znhcqtjkb3tlvpb))/Schedule1.aspx"
    Do Until .readystate = 4
        DoEvents
    Loop

    Set txtSales1 = .document.all.Item("outerRep__ctl0_txtStateSales")
    txtSales1.Value = Sheets("cst").Range("e2").Value
    ...Code shortened for brevity but there are 548 of these in total...
    Set txtSales548 = 
    .document.all.Item("outerRep__ctl66_innerRep__ctl5_txtLocalSales")
    txtSales548.Value = Sheets("cst").Range("e549").Value


    End With
    End Sub

由于项目使用Excel工作表,我想将某些单元格的值发布到税务网站。具体来说,E2到E548,这是收入领域,G2到G548,这是税收领域。这些行中的每一行都与一个征税管辖区相关联,我在D和F 2到548列中收集了相关的表格ID。

我想写的代码   1.在D列中查找表单ID,并从E列发布相关值   2.在F列中查找表单ID并发布G列中的相关值

我认为查找的每个部分的变量都可以自动化。例如。

Set txtSales1 = .document.all.Item("outerRep__ct10_txtStateSales")

可能是:

Dim SetTxt1 As String
Dim Counter1 As Integer
Dim SetTxt2 As String
Dim CellVSales As String
Dim SetTxt3 As String

SetTxt1 = "Set txtSales "
Counter1 = Counter1 + 1
SetTxt2 = "= .document.all.Item("""
CellVSales = E1 + 1
SetTxt3 = """)"

对于第二行,txtSales1.Value = Sheets(“cst”)。Range(“e2”)。Value,它将具有以下设置:

Dim SetTxt4 As String
Dim Counter2 As Integer
Dim SetTxt5 As String
Dim CellVTax As String
Dim SetTxt6 As String

SetTxt4 = "txtSales"
Counter2 = Counter2 + 1
SetTxt5 = ".Value = Sheets(""cst"").Range("""
CellVTax = G1 + 1
SetTxt6 = """).Value"

这是我完全迷失的地方,不知道从哪里开始。如何组合字符串并增加单元格值(例如E1到E2到E3,依此类推)?

我设想第一个字符串会改变

Set txtSales1 = .document.all.Item("outerRep__ct10_txtStateSales")

SetTxt1,Counter1,SetTxt2,CellVSales,SetTxt3

和第二个

txtSales1.Value = Sheets("cst").Range("e2").Value

SetTxt4,Counter2,SetTxt5,CellVTax,SetTxt6

请告诉我,我是否离开这里。我非常感谢有关如何完成此脚本的任何建议或帮助。非常感谢你!

2 个答案:

答案 0 :(得分:0)

'过程太大'意味着你的代码太大而VBA编译器无法处理(这里的数字不是那么好)。让程序运行的唯一方法是缩短它。

上面粘贴的代码似乎很难重复。在我看来,要做的第一件事就是声明你正在使用的范围并使用For Each循环。

如果我理解正确,你的范围将从E2逐行到E584。您可以使用以下命令将其设置为Rng变量:

Dim Rng as Range
Set Rng = Range("E2:E548")

使用.document.all.Item可以替换为.document.getElementByID,这通常对我的知识更有效。

对于每个循环,在此解释:http://www.homeandlearn.org/for_each.html

最后,如果您正在使用来自每个单元格始终位于相同模式的单元格中的数据,则可以使用偏移来获取它们。

因此,对于Rng中的每个循环,将通过从偏移单元格位置获取字符串,然后仅更改适应txtSales值的单元格值来动态设置txtSales。

答案 1 :(得分:0)

根据我之前的评论...

试试这个......你必须编辑你的代码

Option Explicit

Sub Fill_Form()

    Set IE = CreateObject("InternetExplorer.Application")
    With IE
        .Visible = True
        .navigate URL:="https://ritx-fl-cst2.bswa.net/(S(2kgryl5f1znhcqtjkb3tlvpb))/Schedule1.aspx"
        Do Until .readystate = 4
            DoEvents
        Loop

        With .document.all
            .Item("outerRep__ctl0_txtStateSales").Value = Sheets("cst").Range("e2").Value

                    '    ...Code shortened for brevity but there are 548 of these in total...

            .Item("outerRep__ctl66_innerRep__ctl5_txtLocalSales").Value = Sheets("cst").Range("e549").Value
        End With
    End With
End Sub