2016-12-30 118 views
4

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

下面发布的代码将无法识别单元格的位置。有没有办法循环单元格的位置,逐步将信息粘贴到所需的空间中?我希望代码首先将值粘贴到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 
+0

['.Offset()'和'.Resize()'](https://www.businessprogrammer.com/power-excel-vba-secret-avoid-using-select/)是你的朋友。 – ja72

回答

2

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

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

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

感谢您的信息,断点和手表绝对是更好的方式来识别代码中的问题。之前我会在整个代码中添加msgbox来检查变量的值,以查看出错的地方。 – SgtYui

+0

嘿,我们都是从那里开始的:-)弄清楚如何以最有效的方式进行调试是一个重要的里程碑(我仍然有时会遇到麻烦)祝您好运! –

+1

FWIW'Cstr'包装在这里不需要@SgtYui –

2

我想尝试使用“单元格”来做到这一点。

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 
+0

这是很好的知道我可以直接将单元格位置翻译为整数而不是处理字母。特别是当他们交给AA时。 – SgtYui

2

您可以使用偏移功能。

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

我做了下面的代码,因为我也有一些运行时错误。希望能帮助到你。

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 
0

好吧,这里的每一个对方的回答未能使用.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


here从微软如何使用.Resize().Offset().Cells()