选择后如何循环用户选择的范围?

时间:2017-06-26 23:42:32

标签: excel vba excel-vba

我使用For ... Next循环来更改数据透视表中的PageField名称。然后,运行一些处理。当我明确说明数组项目时,我可以让它做我想做的事情(下面注释掉的尝试)。

我宁愿只选择一个范围(因为工作簿中其他位置已存在的项目,在另一个工作表上),然后运行宏。

我认为For循环中有一些不必要的行,并且我没有正确地定义数组。我已经被困在这个问题上太久了。谢谢你的帮助。非常感谢。

我已将整个sub包括在内,只是为了确定,尽管可能不需要。

Sub CyclePages()

'Disables screen refreshing.
Application.ScreenUpdating = False

ActiveWorkbook.RefreshAll
Sheets("Sheet1").Activate
Sheets("Sheet1").Range("A:Z").Select
Selection.ClearContents

Sheets("Sheet2").Activate 'SETTING SHEET TO WHERE THE USER DEFINED ARRAY IS.

Dim arrSht As Variant, i    
'arrSht = Array("Data1", "Data2") 'THIS WORKS.
arrSht = Array(Selection.Value) 'THIS DOES NOT WORK. IT ONLY RUNS THE FIRST ITEM.

For i = LBound(arrSht) To UBound(arrSht)
    With Sheets("Sheet3").PivotTables("PivotTable1").PivotFields("Name1").CurrentPage = _
        ("All")
        Sheets("Sheet3").Activate
        Sheets("Sheet3").PivotTables("PivotTable1").PivotFields("Name1").CurrentPage = _
            (arrSht(i))
        ActiveWorkbook.RefreshAll
        DoEvents

        Sheets("Sheet1").Activate
        ActiveSheet.Range("A5000").End(xlUp).Offset(1, 0).Select
        ActiveCell = arrSht(i)

        Report_Process 'Running extra processing.

    End With
Next i

'ReEnables screen refreshing.
Application.ScreenUpdating = True

End Sub

1 个答案:

答案 0 :(得分:2)

要将工作表值传输到变量,请尝试...

arrSht = Selection.Value

请注意,将工作表值传输到变量会创建一个二维数组。例如,假设您选择A1:A10,arrSht将是一个10行乘1列的数组。所以你需要访问这样的项目......

For i = LBound(arrSht) To UBound(arrSht)
    Debug.Print arrSht(i, 1)
Next

但是,假设您选择A1:J1,arrSht将是1行乘10列数组。所以你需要访问这样的项目......

For i = LBound(arrSht, 2) To UBound(arrSht, 2)
    Debug.Print arrSht(1, i)
Next