Как заставить абсолютную ссылку на ячейку в цикле работать и пропускать столбец в цикле?
Я ПОЧТИ получил мой код, работающий, но есть все еще две вещи, неправильные с этим (две главные вещи так или иначе).
1) Абсолютная ячейка исх. не работает, как в Excel. Я хочу, например, $ A5, но вместо того, чтобы перейти на A6 A7 и т. Д., Он остается A5 на протяжении всего цикла.
2) Есть третий столбец, который мне нужно пропустить. Мне нужен только мой цикл для записи в столбцы под VOL и CAP, а не%UTIL. Как я могу сказать, чтобы мой цикл пропустил $UTIL?
http://i27.tinypic.com/2dig8hu.jpg
Option Explicit
Dim myRange As Range
Function numberOfRows() As Integer
Debug.Print ("Start test")
ThisWorkbook.Worksheets("LCI").Range("A9").Select
Set myRange = Range(Selection, Selection.End(xlDown))
Debug.Print ("Rows: " & myRange.Rows.Count)
numberOfRows = (myRange.Rows.Count)
End Function
Function numberOfColumns() As Integer
Debug.Print ("Start test")
ThisWorkbook.Worksheets("LCI").Range("B8").Select
Set myRange = Range(Selection, Selection.End(xlToRight))
Debug.Print ("Columns: " & myRange.Columns.Count)
numberOfColumns = (myRange.Columns.Count)
End Function
Sub TieOut(ByVal numberOfRows As Integer, ByVal numberOfColumns As Integer)
Dim i As Integer 'i is row
Dim j As Integer 'j is column
For i = 1 To numberOfRows 'Loop over rows
For j = 1 + 2 To numberOfColumns 'Loop over columns
ThisWorkbook.Worksheets("Loop").Select
With ThisWorkbook.Worksheets("Loop")
**.Cells(i + 3, j + 1).Value = "=INDEX('ZAINET DATA'!$A$1:$H$39038,MATCH(Loop!B$2&TEXT(Loop!$A4,""M/D/YYYY""),'ZAINET DATA'!$C$1:$C$39038,0),4)"
.Cells(i + 3, j + 2).Value = "=INDEX('ZAINET DATA'!$A$1:$H$39038,MATCH(Loop!B$2&TEXT(Loop!$A4,""M/D/YYYY""),'ZAINET DATA'!$C$1:$C$39038,0),5)"**
End With
Next j
Next i
End Sub
Sub Test()
Dim x As Integer
Dim y As Integer
x = numberOfRows()
y = numberOfColumns()
Call TieOut(x, y)
End Sub
2 ответа
Где вы это определили? Является ли это частью модуля BAS?
РЕДАКТИРОВАТЬ: Поставьте Option Explicit в качестве первой строки модуля BAS & compile (меню Debug -> Compile).
Вы увидите, что есть ошибки компиляции.
Удалить Dim myRange As Range
из Macro1 и Macro2.
Поместите его в верхней части модуля BAS (после явной опции)
Примечание. Если переменная определена как часть SUB, другие SUB/ функции не смогут ее использовать. Чтобы TieOut использовал myRange, он должен быть определен в области, в которой он может использоваться всеми SUB.
Кроме того, Macro1 должен запускаться первым - это присваивает значение MyRange
(то есть Set MyRange = .....)
Если Macro1 не запущен, MyRange не будет содержать значения, и, следовательно, произойдет ошибка времени выполнения, когда ваш код попытается прочитать свойство (MyRange.Rows.Count).
Пожалуйста, уделите некоторое время, чтобы прочитать о области видимости переменных.
Переменная должна содержать какое-то значение, прежде чем пытаться читать из него.
Это отличный пример, чтобы узнать, что такое "сфера". Вы объявляете (или создаете) переменную, такую как диапазон, который вы пытаетесь создать. Он живет внутри макроса (или подпроцедуры), который вы сделали. Однако, когда подпроцедура завершена, ваша переменная больше не имеет места для жизни и выселяется (выпадает из памяти вашего компьютера).
К сожалению, то, как вы закодировали ваши макросы, не будет работать так, как вы надеетесь, что они работают. Ваши myRanges будут умирать каждый раз, когда они достигнут End Sub.
Также при передаче аргументов (ваших байлов) в другую подпроцедуру (в данном случае ваш TieOut) вы должны указать правильное количество аргументов. Ваша процедура TieOut в настоящее время требует два. Вы не можете пройти одно, а затем другое. Правильный путь будет выглядеть примерно так:
Call TieOut(myRange.Rows.Count, myRange.Columns.Count)
Также вы пытаетесь вызвать процедуру с именем TieOut2. Не уверен, что это опечатка, но важно правильно называть имена процедур.
VBA очень мощная и, на мой взгляд, заслуживает изучения. Ты выглядишь так, будто царапаешь поверхность. Я определенно искал бы некоторые учебники VBA онлайн. Сосредоточьтесь на вызове процедур, объявлении переменных и области видимости, и я гарантирую, что вы сможете решить вашу проблему:D