如何遍历行,将它们保存为variables,并将它们用作variablesVBA

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

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

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

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)).Select何时用于说Sheets(Second)).Select

和debug.print来查看它是否真正在工作,但是没有logging到立即窗口。

此外,当我真的运行它,没有错误出现,但似乎没有发生。

不知道还有什么要补充的,还有别的什么可以尝试的。 干杯!

作为第一个说法,在循环中使用(至less第一个)工作表似乎是不必要的,因为循环的开始是决定哪个工作表被用来控制循环的stream程。

此外,我认为最好是完全删除表单激活,重新讨论。select(情况是不一样的,但是这里讨论的解决scheme对于两者都更好。在几乎所有情况下select和.Activate ): 如何避免使用在Excel VBAmacros中select 。

让我们来看看是否可以更直接地引用“数据”表中的表格,以及做一些错误检查。

我的build议:

 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 

如果出现任何错误,请说明显示的是哪一行,以及错误消息的实际内容。

参考: http : //www.mrexcel.com/forum/excel-questions/3228-visual-basic-applications-check-if-worksheet-exists.html#post13739