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

我试图在Excel中循环访问A列。 检查它是否有一个值,如果有,移动到b列中的相邻单元格,并检查该值并将其存储以用于search。

我甚至无法通过A列正在工作的循环。 我看了数百个例子,我有什么应该工作。

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

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 

你的许多variables的尺寸不正确,这可能会造成错误(或者可能在未来造成错误)。

例如, Dim i, j, FirstCell, LastCell As Integer ijFirstCell为Variant。 只有LastCell as Integer 。 同样的: Dim Cell, Row, Column As Excel.Range声明CellRow为Variant,只有Column声明为Rangevariables。

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

 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 

一般意见1

VBA中的维度应该按variables完成,只有最后一个行将获得您指定的types。 所以如下:

 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

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

现在的问题

你可以循环遍历行,但是你的脚本根本不会和行进行交互! 你的脚本正在与ActiveCell范围进行交互……所以,改变脚本中的ActiveCell以引用Rowvariables(使用它的新名称…):

 If Not IsEmpty(Row.Value) Then 

看看会发生什么!

此外,我想知道是否Range("A9:A250").Rows实际上包含任何东西,因为你不明确提到Excel工作表对象。 你最好在debugging模式下运行,看看你的本地variables和对象实际上是指你期望的…

我没有得到你的代码是做什么的,但我认为你的代码中有几个问题:

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

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

3)在ActiveCell将引用迭代的单元格之前,必须激活它,如(row1.Activate)。 不过,我更喜欢使用select和select。

4)当你打开其他Excel应用程序和创build对象,在代码结束时,您应该closures或释放它们,如“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 

End sub

这是什么工作:

 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 

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

 For Each Cell In Row.Cells