【问题标题】:VBA: Reference cell address with a loopVBA:带循环的参考单元地址
【发布时间】:2020-07-30 04:03:28
【问题描述】:

我有一本大约 40 张的工作簿。我在 sheet1 上的表格中工作,正在编译整个工作簿中的数据。

A 列中的每个单元格值在工作簿中的某处都有对应的同名工作表。

我正在尝试遍历列并为每个单元格 1) 找到相应的工作表 2) 复制单个单元格值 3) 将该值粘贴回原始表格的右侧。

我目前的尝试如下。我不断收到(错误 91)未设置对象变量。任何调试技巧或一般建议将不胜感激!

Sub LoopColumn()
 
Dim cell As Range
Dim ws As Worksheet
Dim ws_num As Integer
Dim CellName As String
Dim CellLocation As Range


ws_num = ThisWorkbook.Worksheets.Count
Worksheets(1).Select

For Each cell In Range("A:A")
    CellName = ActiveCell.Value
    CellLocation = ActiveCell.Address
   
        
        For i = 1 To ws_num

            If ws.Name = CellName Then
                ThisWorkbook.Worksheets(i).Activate

                ActiveSheet.Range("L1").Select
                Selection.Copy
                ActiveSheet.Paste Destination:=Worksheets(1).Range(CellLocation.Offset(0, 4))
            
            End If
        Next i
    
    Worksheets(1).Select
Next cell
 
 
End Sub

【问题讨论】:

  • If ws.Name = CellName Then - 你永远不会Set ws
  • 你真的应该 find the last row 而不是循环遍历 A 列中的每个单元格
  • 您真的要遍历 A 列中的 1048576 单元格吗?
  • 您正在获取(错误 91)未设置对象变量。因为您已声明 ws 对象 Dim ws as worksheet 但尚未将其设置为任何工作表。

标签: excel vba


【解决方案1】:

一些建议:

Sub LoopColumn()
 
    Dim c As Range, ws As Worksheet, wsList As Worksheet
    
    Set wsList = ThisWorkbook.Worksheets(1)
    
    'only loop cells in the used range of ColA
    For Each c In wsList.Range("A1:A" & wsList.Cells(Rows.Count, 1).End(xlUp).Row).Cells
        If c.Value <> "" Then
            Set ws = Nothing
            On Error Resume Next 'ignore error if no sheet with this name
            Set ws = ThisWorkbook.Worksheets(c.Value) 'try to get the sheet
            On Error GoTo 0      'stop ignoring errors
            If Not ws Is Nothing Then
                ws.Range("L1").Copy c.Offset(0, 4) 'no need to activate anything
            End If
        End If
    Next c
    
End Sub

【讨论】:

    【解决方案2】:

    如果您需要一般调试建议

    1. 使用F8 逐行运行代码并找出导致错误的行(如果代码很短)
    2. 使用breakpoint(代码一侧的红点)提早停止代码并查看错误前的变量值
    3. 在代码顶部使用Option Explicit 强制您正确声明每个变量

    有了一些使用断点和在调试时运行代码的经验,您很可能能够找到错误发生的位置和原因。它会让您更轻松地在线查看或在 Stack 上更好地提问!

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      • 2015-10-15
      相关资源
      最近更新 更多