2016-02-08 2 views
1

Я пытаюсь сохранить значения в листах как переменную, а затем перейти к ссылке на лист, используя эту переменную, а также использовать ее для фильтрации от.Как перемещаться по строкам, сохранять их как переменные и использовать их в качестве переменных VBA

Это будет зациклировано до тех пор, пока программа не достигнет первой пустой ячейки.

Соответствующий код у меня до сих пор:

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's, чтобы увидеть, действительно ли он работает, но он не входит в непосредственное окно.

Кроме того, когда я на самом деле запускаю его, ошибки не возникает, но ничего не происходит.

Не знаете, что еще добавить, или что еще попробовать. Ура!

ответ

0

Как первое замечание, использование (по крайней мере первой) активации листа в цикле кажется ненужным, поскольку начало цикла - это то, что определяет, какой лист используется для управления потоком цикла.

Кроме того, я бы утверждать, что лучше, чтобы удалить активацию листа в целом, Re: обсуждение .Select (случаи не то же самое, но решение обсуждалось здесь работает лучше для обоих .Select и .Activate почти во всех экземпляры): How to avoid using Select in Excel VBA macros.

Давайте посмотрим, можно ли более подробно ссылаться на таблицу на листе «ДАННЫЕ», а также делать некоторые ошибки.

Мое предложение:

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 

Если вы получаете какие-либо ошибки, пожалуйста, указать, какой линии он появляется на то, что и сообщение об ошибке на самом деле.

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

+0

Спасибо @Vegard за помощь я получил ошибку «недопустимое использование собственности» на этой линии: dataTb1.AutoFilter _ Насколько я знаю, таблица не имеет имя. Это динамический список, который увеличивается с течением времени (поэтому я каждый раз переделываю материал AutoFilter). –

+0

Это 'dataTbl', а не' dataTb1'. И он находит любую таблицу в 'A1'. Но пытаетесь ли вы сказать, что вы не используете таблицы? – Vegard

+0

Я также должен добавить, что debug.Print еще ничего не показывает, (он работает в других подсистемах). Кроме того, «Таблицы» («ДАННЫЕ»). Диапазон («A1: H6040»). Копия »- номер 6040 просто используется, потому что он намного больше, чем я, вероятно, когда-либо понадобится. В этом смысле у вас есть предложение использовать что-то, что просто ссылается на соответствующую таблицу? Приветствия снова! –

Смежные вопросы