我试图遍历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
答案 0 :(得分:2)
您的许多变量的尺寸不正确,这可能导致错误(或者可能在将来导致错误)。
例如,Dim i, j, FirstCell, LastCell As Integer
将i
,j
和FirstCell
声明为Variant。只有1个}}。与:LastCell as Integer
相同,它将Dim Cell, Row, Column As Excel.Range
,Cell
声明为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