Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何循环行,将行另存为变量并将其用作变量VBA_Vba_Excel - Fatal编程技术网

如何循环行,将行另存为变量并将其用作变量VBA

如何循环行,将行另存为变量并将其用作变量VBA,vba,excel,Vba,Excel,我试图将值作为变量存储在工作表中,然后继续使用该变量引用工作表,并使用它进行筛选 这将循环执行,直到程序到达第一个空单元格 到目前为止,我掌握的相关代码是: Sub Program() Dim i As Integer i = 2 Do Until IsEmpty(Cells(i, 1)) Debug.Print i Sheets("Button").Activate Dim First As String First = Cells(i, 1).Va

我试图将值作为变量存储在工作表中,然后继续使用该变量引用工作表,并使用它进行筛选

这将循环执行,直到程序到达第一个空单元格

到目前为止,我掌握的相关代码是:

Sub Program()

Dim i As Integer
i = 2

Do Until IsEmpty(Cells(i, 1))
Debug.Print i
    Sheets("Button").Activate
        Dim First As String
        First = Cells(i, 1).Value
        Debug.Print First

        Dim Second As String
        Second = Cells(i, 2).Value
        Debug.Print Second 

    'Filters my Data sheet and copies the data

    Sheets("DATA").Activate
    Sheets("DATA").Range("A1").AutoFilter _
        Field:=2, _
        Criteria1:=First 'Filters for relevant organisation
    Sheets("DATA").Range("A1").AutoFilter _
        Field:=6, _
        Criteria1:="=" 'Filters for No Response

    Sheets("DATA").Range("A1:H6040").Copy

    'This should loop through for each separate group

    Sheets(CStr(Second)).Select
    Range("A1").Select
        ActiveSheet.Paste
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False

i = i + 1
Loop

Worksheets("DATA").AutoFilterMode = False

End Sub
我已对程序进行了重大更改,试图添加诸如“CStr”之类的符号,因为此行出现错误:
Sheets(CStr(Second))。当它用来表示
Sheets(Second))时,选择
。选择

和debug.print来查看它是否实际工作,但它没有记录到即时窗口

此外,当我实际运行它时,没有出现错误,但似乎什么也没有发生

不确定还要添加什么,或者还要尝试什么。干杯

首先,在循环中使用(至少第一个)板材激活似乎是不必要的,因为循环的开始决定了使用哪个板材来控制循环的流程

此外,我认为最好完全删除工作表激活,关于
.Select
的讨论(情况不同,但本文讨论的解决方案对
.Select
.Activate
几乎在所有情况下都更有效):

让我们看看是否可以更直接地参考“数据”表中的表格,以及进行一些错误检查

我的建议是:

Sub Program()

Dim i As Integer
Dim First, Second As String
Dim secondWs As Worksheet
Dim dataTbl As ListObject

i = 2
Set dataTbl = Worksheets("DATA").Range("A1").ListObject.Name 
' The above can be done more elegantly if you supply the name of the table

Sheets("DATA").Activate

Do Until IsEmpty(Cells(i, 1))
Debug.Print i
        First = Sheets("Button").Cells(i, 1).Value
        Debug.Print First

        Second = Sheets("Button").Cells(i, 2).Value
        Debug.Print Second 

    'Filters my Data sheet and copies the data

    dataTbl.AutoFilter _
        Field:=2, _
        Criteria1:=First 'Filters for relevant organisation
    dataTbl.AutoFilter _
        Field:=6, _
        Criteria1:="=" 'Filters for No Response

    Sheets("DATA").Range("A1:H6040").Copy

    'This should loop through for each separate group

    On Error Resume Next
    Set secondWs = Worksheets(Second)
    On Error GoTo 0

    If Not secondWs Is Nothing Then
        secondWs.Range("A1").PasteSpecial Paste:=xlPasteValues
    Else
        Debug.Print "Sheet name SECOND was not found"
    End If

i = i + 1
Loop

Worksheets("DATA").AutoFilterMode = False

End Sub
如果您收到任何错误,请说明它出现在哪一行以及错误消息的实际内容

参考: 作为第一句话,在循环中使用(至少第一个)工作表激活似乎是不必要的,因为循环的开始决定了使用哪个工作表来控制循环的流程

此外,我认为最好完全删除工作表激活,关于
.Select
的讨论(情况不同,但本文讨论的解决方案对
.Select
.Activate
几乎在所有情况下都更有效):

让我们看看是否可以更直接地参考“数据”表中的表格,以及进行一些错误检查

我的建议是:

Sub Program()

Dim i As Integer
Dim First, Second As String
Dim secondWs As Worksheet
Dim dataTbl As ListObject

i = 2
Set dataTbl = Worksheets("DATA").Range("A1").ListObject.Name 
' The above can be done more elegantly if you supply the name of the table

Sheets("DATA").Activate

Do Until IsEmpty(Cells(i, 1))
Debug.Print i
        First = Sheets("Button").Cells(i, 1).Value
        Debug.Print First

        Second = Sheets("Button").Cells(i, 2).Value
        Debug.Print Second 

    'Filters my Data sheet and copies the data

    dataTbl.AutoFilter _
        Field:=2, _
        Criteria1:=First 'Filters for relevant organisation
    dataTbl.AutoFilter _
        Field:=6, _
        Criteria1:="=" 'Filters for No Response

    Sheets("DATA").Range("A1:H6040").Copy

    'This should loop through for each separate group

    On Error Resume Next
    Set secondWs = Worksheets(Second)
    On Error GoTo 0

    If Not secondWs Is Nothing Then
        secondWs.Range("A1").PasteSpecial Paste:=xlPasteValues
    Else
        Debug.Print "Sheet name SECOND was not found"
    End If

i = i + 1
Loop

Worksheets("DATA").AutoFilterMode = False

End Sub
如果您收到任何错误,请说明它出现在哪一行以及错误消息的实际内容

参考:

谢谢@Vegard的帮助,我在这一行中遇到了一个“属性使用无效”的错误:dataTb1.AutoFilter uu据我所知,该表没有名称。它是一个动态列表,随着时间的推移其大小会增加(这就是为什么我每次都要重做自动筛选的原因)。它是
dataTbl
,而不是
dataTb1
。它会找到
A1
中存在的任何表。但是,您是想说您没有使用表吗?我还应该补充一点,debug.Print仍然没有显示任何内容(它在其他sub中工作)。此外,“Sheets(“DATA”).Range(“A1:H6040”).Copy”-使用数字6040只是因为它比我可能需要的要大得多。从这个意义上讲,您是否有建议使用简单引用相关表格的内容?再次干杯
Set dataTbl=Worksheets(“DATA”).Range(“A1”).ListObject.Name
此行将变量
dataTbl
绑定到
A1
所属的任何表。正确添加此引用(请参阅我之前的评论)并查看它是否有效。如果不是,你需要更清楚地描述你的错误。嘿,我一定问得很奇怪,但你帮了大忙。我只需设置
dataTbl=Worksheets(“DATA”).Range(“A1”)
。这使整个循环按预期工作,因此再次感谢您,并进行了一些其他更改,我可以很高兴地执行此程序。该程序正是我所需要的:)感谢@Vegard的帮助,我在这一行上遇到了一个“无效使用属性”的错误:dataTb1.AutoFilter u据我所知,该表没有名称。它是一个动态列表,随着时间的推移其大小会增加(这就是为什么我每次都要重做自动筛选的原因)。它是
dataTbl
,而不是
dataTb1
。它会找到
A1
中存在的任何表。但是,您是想说您没有使用表吗?我还应该补充一点,debug.Print仍然没有显示任何内容(它在其他sub中工作)。此外,“Sheets(“DATA”).Range(“A1:H6040”).Copy”-使用数字6040只是因为它比我可能需要的要大得多。从这个意义上讲,您是否有建议使用简单引用相关表格的内容?再次干杯
Set dataTbl=Worksheets(“DATA”).Range(“A1”).ListObject.Name
此行将变量
dataTbl
绑定到
A1
所属的任何表。正确添加此引用(请参阅我之前的评论)并查看它是否有效。如果不是,你需要更清楚地描述你的错误。嘿,我一定问得很奇怪,但你帮了大忙。我只需设置
dataTbl=Worksheets(“DATA”).Range(“A1”)
。这使得整个循环如预期的那样工作,再次感谢您,再加上一些其他的更改,我可以很高兴地完成这个程序,这正是我需要它的地方:)