尝试使用VBA循环访问Excel中的列。我究竟做错了什么?

时间:2013-04-09 08:59:24

标签: excel vba

我试图遍历Excel中的A列。检查它是否有值,如果有,则移动到b列中的相邻单元格并检查该值并将其存储以用于搜索。

我甚至无法通过A列的循环工作。我已经看了几百个例子以及我应该做些什么。

有人可以指出缺少什么吗?这是我的代码:

Sub AdjacentRow()

    Dim xlWrkBk As Excel.Workbook

    Dim xlsht As Excel.Worksheet
    Dim xl As Excel.Application

    Set xl = CreateObject("Excel.Application")
    Set xlWrkBk = GetObject("C:\Users\my_username\Desktop\AgileProjects\ITAG Open Interactions.xlsx")
    Set xlsht = xlWrkBk.Worksheets(1)

    Dim i, j, FirstCell, LastCell As Integer
    Dim strIMresult As String


    Dim Cell, Row, Column As Excel.Range

    'Set Cell = Range("A9").End(xlDown)
    'Set Cell = Range([a1], [a250])

    For Each Row In Range("A9:A250").Rows
        If Not IsEmpty(ActiveCell.Value) Then
            'move to adjacent cell
            ActiveCell.Offset(0, 1).Select
            If Not IsEmpty(ActiveCell.Value) Then
                'copy the value
                strIMresult = ActiveCell.Value
                'ActiveCell.Offset(1, 0).Select
                'ActiveCell = strIMresult
                Debug.Print strIMresult
            Else
                ActiveCell.Offset(0, -1).Select
            End If
        End If
    Next Row

End Sub

4 个答案:

答案 0 :(得分:2)

您的许多变量的尺寸不正确,这可能导致错误(或者可能在将来导致错误)。

例如,Dim i, j, FirstCell, LastCell As IntegerijFirstCell声明为Variant。只有1个}}。与:LastCell as Integer相同,它将Dim Cell, Row, Column As Excel.RangeCell声明为Variant,仅将Row声明为Range变量。

这应该让你开始。我清理了声明,并删除了你注释掉的行并进行了一些更改,以便你的Loop现在可以正常工作。

Column

答案 1 :(得分:1)

一般评论1

VBA中的尺寸标注应该按变量完成,只有连续的最后一个将获得您指定的类型。以下是:

Dim Cell, Row, Column As Excel.Range

应该成为:

Dim Cell As Excel.Range, Row As Excel.Range, Column As Excel.Range

如果此脚本在Excel VBA中,您甚至不需要使用Excel。只需将其标注为Range:

Dim aa As Range

一般评论2

使用Row,Column和Cell作为局部变量,这些是Excel中的现有对象,也不应该用作局部变量名!此外,他们对这样的名字并没有多说。请将这些变量/对象名称更改为有意义且唯一的名称!

现在问题

你在循环中循环,但是你的脚本根本不与Row交互!您的脚本正在与ActiveCell范围交互...因此,在脚本中更改ActiveCell以引用Row变量(使用其新名称...):

If Not IsEmpty(Row.Value) Then

看看会发生什么!

此外,我想知道Range("A9:A250").Rows实际上是否包含任何内容,因为您没有明确引用Excel工作表对象。您最好在调试模式下运行它,以查看您的本地变量和对象是否实际引用了您期望的内容......

答案 2 :(得分:1)

我没有得到你的代码的意图,但我认为你的代码中几乎没有问题:

1)避免使用与vba对象名称相同的变量名称,例如“row”,“column”,“cell”。它可能会导致错误,所以最好使用相同的名称,如“myrow”,“row1”,“rw”等。

2)如果你想在其中一个“ITAG Open Interactions.xlsx”表上进行循环,你必须引用它的名称并指定表格,如“xlWrkBk.Worksheets(1).Range(”A9: A250 “)。行”

3)在ActiveCell引用迭代单元格之前,必须激活它,如(row1.Activate)。但是,我更喜欢使用选择和选择。

4)当你打开其他excel应用程序并创建对象时,你应该在代码的末尾关闭或释放它们,比如“set xlWrkbk = nothing”或“xl.Application.Quit”。

5)当使用循环“For Each”时,您可以检查当前迭代范围是否满足您的编码,然后执行指定的操作。您不必返回右列,因此可以跳过外部if语句。

我并不知道你想用strIMresult做什么,但是整个代码看起来应该是这样的:

Sub AdjacentRow()

Dim xlWrkBk As Excel.Workbook
Dim xl As Excel.Application

Set xl = CreateObject("Excel.Application")
Set xlWrkBk = GetObject("D:\Excel\a.xlsx")

Dim i, j As Integer
Dim strIMresult As String
Dim row1 As Excel.Range

xlWrkBk.Worksheets(1).Activate
For Each row1 In xlWrkBk.Worksheets(1).Range("A9:A250").Rows
    row1.Select
    If Not IsEmpty(Selection) Then
        'move to adjacent cell
        Selection.Offset(0, 1).Select
        strIMresult = Selection
        'I dont understand what the code should do with the value from b column,
        'so you should add here some code.
        'For now I just added code that print string value in the message box
        MsgBox (strIMresult)
    End If
Next

Set xlWrkBk = Nothing
xl.Application.Quit

结束子

答案 3 :(得分:0)

这是有用的:

Sub AdjacentRow()

    Dim xlWrkBk As Excel.Workbook

    Dim xlsht As Excel.Worksheet
    Dim xl As Excel.Application

    Set xl = CreateObject("Excel.Application")

    Set xlWrkBk = GetObject("C:\Users\My_Account\Desktop\tst.xlsx")
    Set xlsht = xlWrkBk.Worksheets(1)

    Dim i, j, FirstCell, LastCell As Integer
    Dim strIMresult As String


    Dim Cell, Row, Column As Excel.Range

    For Each Row In xlsht.Range("A9:A250").Rows
        For Each Cell In Row.Cells

            If Len(Cell.Value) > 0 Then
                'move to adjacent cell
                ActiveCell.Offset(0, 1).Select

                If Len(ActiveCell.Value) > 0 Then
                    'copy the value
                    strIMresult = ActiveCell.Value

                    Debug.Print strIMresult
                Else
                    ActiveCell.Offset(0, -1).Select
                End If
            End If
        Next Cell
    Next Row
End Sub

最终解决方案如下

For Each Row In Range("A9:A250").Rows

更改为

For Each Row In xlsht.Range("A9:A250").Rows

指定必须循环的工作表。然后添加,

For Each Cell In Row.Cells