Как заставить абсолютную ссылку на ячейку в цикле работать и пропускать столбец в цикле?

Я ПОЧТИ получил мой код, работающий, но есть все еще две вещи, неправильные с этим (две главные вещи так или иначе).

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

Другие вопросы по тегам