2016-12-30 10 views
4

Я ищу способ итерации через ячейки на листе для вставки значений.VBA Iterate через ячейки

Код, указанный ниже, не будет распознавать местоположения ячеек. Есть ли способ закодировать ячейку, чтобы постепенно вставлять информацию в нужные места? Я хочу, чтобы код сначала вставлял значение в 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 * у: C1 + 4 * у», которые, очевидно, не является действительным адресом. Вам нужно оценить числовое выражение за строкой, преобразовать обратно в строку (либо явно использовать 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

Полезно знать, что я могу переводить ячейки прямо в целые числа вместо того, чтобы иметь дело с буквами. Особенно, когда они переходят к АА. – 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 Read от Microsoft о том, как использовать .Resize(), .Offset() и .Cells().

Смежные вопросы