【问题标题】:VBA Iterate through cellsVBA 遍历单元格
【发布时间】:2017-05-14 07:54:00
【问题描述】:

我正在寻找一种方法来遍历工作表中的单元格以粘贴值。

下面发布的代码将无法识别单元格位置。有没有办法循环单元格位置以逐步将信息粘贴到所需的空间中?我希望代码先将值粘贴到 A1:C1 中,然后移动 4 个空格并发布到 E1:G1 等等。

不确定如何迭代字母以移动单元格。

Sub test()

Dim x As Integer
Dim y As Integer
Dim InputSheet As Worksheet
Dim myBook As Workbook

Set myBook = Excel.ActiveWorkbook
Set InputSheet = myBook.Sheets("InputSheet")

For y = 0 To 5
    x = 4
    InputSheet.Range("A1 + 4*y : C1 + 4*y").Value = x
Next y

End Sub

【问题讨论】:

标签: vba excel


【解决方案1】:

我会尝试使用“细胞”来做到这一点。

Sub test()

Dim x As Integer
Dim y As Integer
Dim InputSheet As Worksheet
Dim myBook As Workbook

Set myBook = Excel.ActiveWorkbook
Set InputSheet = myBook.Sheets("InputSheet")

For y = 0 To 5
    x = 4
    InputSheet.Range(InputSheet.Cells(1, 4 * y + 1), InputSheet.Cells(1, 4 * y + 3)).Value = x
Next y

End Sub

【讨论】:

  • 很高兴知道我可以将单元格位置直接转换为整数,而不是处理字母。尤其是当他们越过 AA 时。
【解决方案2】:

您可以使用偏移功能。

For i = 0 to 5
    x = 4
    InputSheet.Range("A1:C1").Offset(0, i * 4) = x
Next i

【讨论】:

    【解决方案3】:

    您告诉工作簿从字面上查找范围“A1 + 4*y : C1 + 4*y”,这显然不是有效地址。您需要评估字符串外部的数值表达式,转换回字符串(显式使用Cstr 或者您可以将表达式放在括号中并让编译器为您完成,因为 VBA 是动态类型的,这是您的一个重要概念可能需要查找。基本上它能够从上下文中找出它正在处理一个字符串类型变量),最后将它重新添加到您的地址上以使其正常工作。

    由于您似乎是 vba/coding 的新手,我建议您弄清楚如何使用断点和监视来查看您的机器如何实际评估您的变量。

    InputSheet.Range("A" & (1+4*y) & ":C" & (1+4*y)).Value = x
    

    【讨论】:

    • 感谢您的信息,断点和监视似乎是识别代码问题的更好方法。在我在整个代码中添加 msgbox 以检查变量的值以查看哪里出错之前。
    • 嘿,我们都从那里开始 :-) 弄清楚如何以最有效的方式进行调试是一个重要的里程碑(有时我仍然遇到麻烦哈哈)祝你好运!
    • FWIW Cstr 这里不需要包装器@SgtYui
    • @Sott Holtzman 你是对的!不知道,所以我本能地玩得很安全,但这里显然不需要。更多阅读stackoverflow.com/questions/11595226/… 似乎 cstr 是一种非常无用的方法。
    • 不。使用.Range("A" & (1+4*y) & ":C" & (1+4*y)) 中的字符串数学并不是最佳实践。使用.Range("A1").Offset(4*y,0).Resize(1,3) 要好得多,因为您将位置和大小保持为整数。
    【解决方案4】:

    我执行以下代码是因为我也遇到了一些运行时错误。希望对您有所帮助。

    Dim wb As Workbook
    
    Dim ws As Object
    
    Set wb = Workbooks("Libro2")
    
    Set ws = wb.Sheets("Hoja1")
    
    For i = 1 To 10000
    
            Dim strrangoa As String
            Dim strrangob As String
                'Creating a string variable replaces selecting the cell
                strrangoa = "A" & i
                strrangob = "B" & i
                'If the active cell does not have data, it exits the loop
                If ws.Range(strrangoa).Value = "" Then
                    GoTo Salir
                Else
                'The data from cells in Column A are passed to Column B
                    ws.Range(strrangob).Value = ws.Range(strrangoa).Value
                End If
    
    Next
    
    Salir:
    
    End Sub
    

    【讨论】:

      【解决方案5】:

      好的,这里的所有其他答案都未能使用.Resize() 函数来选择一系列单元格,这是推荐的方式。

      Option Explicit
      
      Sub Test()
      
          Dim x As Integer
          Dim y As Integer
          Dim InputSheet As Worksheet
          Dim myBook As Workbook
      
          Set myBook = Excel.ActiveWorkbook
          Set InputSheet = myBook.Sheets("InputSheet")
      
          For y = 0 To 5
              x = 4
              ' Start for "A1", move down 4*y rows, and select
              ' one row and 3 columns to set the value
              InputSheet.Range("A1").Offset(4*y, 0).Resize(1, 3).Value = x
      
              ' Similar to using the `.Cells()` method
              ' InputSheet.Range("A1").Cells(4*y+1, 1).Resize(1, 3).Value = x
          Next y       
      
      End Sub
      

      PS。您还可以执行以下操作

      InputSheet.Range("A2").Resize(1,3).Value = Array(1,2,3)
      

      将单元格 A2,B2,C2 设置为 1,2,3

      InputSheet.Range("A2").Resize(3,1).Value = _ 
                WorksheetFunction.Transpose(Array(1,2,3))
      

      将单元格 A2,A3,A4 设置为 1,2,3


      阅读 Microsoft 的 here,了解如何使用 .Resize().Offset().Cells()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-28
        • 2021-12-24
        • 2018-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多