0

我正在尝试遍历 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

4 回答 4

2

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

例如,将、 和Dim i, j, FirstCell, LastCell As Integer声明为 Variant。只有. 与:将 声明为 Variant 相同,仅声明为 Range 变量。ijFirstCellLastCell as IntegerDim Cell, Row, Column As Excel.RangeCellRowColumn

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

Sub AdjacentRow()

Dim xlWrkBk As Excel.Workbook

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

Dim i#, j#, FirstCell#, LastCell#
Dim strIMresult As String
Dim cl As Excel.Range
Dim clNext As Excel.Range


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

For Each cl In xlsht.Range("A9:A250")
    Set clNext = cl.Offset(0, 1)
    If Not cl.Value = vbNullString Then
        'check the adjacent cell'
        If Not clNext.Value = vbNullString Then
            'store the value'
            strIMresult = clNext.Value
            Debug.Print strIMresult
        End If
    End If
Next Row

End Sub
于 2013-04-09T13:57:57.800 回答
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。只需将其标注为范围:

Dim aa As Range

一般性评论 2

您使用行、列和单元格作为局部变量,这些是 Excel 中现有的对象,也不应该用作局部变量名!!此外,他们对这样的名字并没有说太多。请将这些变量/对象名称更改为有意义且独特的名称!

现在解决问题

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

If Not IsEmpty(Row.Value) Then

看看会发生什么!

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

于 2013-04-09T13:56:32.930 回答
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

结束子

于 2013-04-09T14:17:20.757 回答
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
于 2013-04-09T14:14:39.790 回答