Как заставить абсолютную ссылку на ячейку в цикле работать и пропускать столбец в цикле? - PullRequest
0 голосов
/ 15 июля 2009

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

1) Абсолютная ячейка исх. не работает, как в Excel . Я хочу, например, $ A5, но вместо того, чтобы перейти на A6 A7 и т. Д., Он останется A5 на протяжении всего цикла.

2) Есть третий столбец, который мне нужно пропустить. Мне нужен только мой цикл для записи в столбцы под VOL и CAP, а не% UTIL. Как я могу сказать, чтобы мой цикл пропустил $ UTIL?

alt text

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 ]

0 голосов
/ 16 июля 2009

Это отличный пример, чтобы узнать, что такое «сфера действия». Вы объявляете (или создаете) переменную, такую ​​как диапазон, который вы пытаетесь создать. Он живет внутри макроса (или подпроцедуры), который вы сделали. Однако, когда подпроцедура завершена, ваша переменная больше не имеет места для жизни и выселяется (выпадает из памяти вашего компьютера).

К сожалению, то, как вы закодировали ваши макросы, не будет работать так, как вы надеетесь, что они работают. Ваши myRanges будут умирать каждый раз, когда они достигнут End Sub.

Также при передаче аргументов (ваших байлов) в другую подпроцедуру (в данном случае ваш TieOut) вы должны указать правильное количество аргументов. Ваша процедура TieOut в настоящее время требует два. Вы не можете пройти одно, а затем другое. Правильный путь будет выглядеть примерно так:

Call TieOut(myRange.Rows.Count, myRange.Columns.Count)

Также вы пытаетесь вызвать процедуру с именем TieOut2. Не уверен, что это опечатка, но важно правильно указывать имена процедур.

VBA очень мощный и, на мой взгляд, заслуживает изучения. Ты выглядишь так, будто царапаешь поверхность. Я определенно искал бы некоторые учебники VBA онлайн. Сосредоточьтесь на вызове процедур, объявлении переменных и области видимости, и я гарантирую, что вы сможете решить вашу проблему: D

0 голосов
/ 15 июля 2009

Где вы это определили? Это часть модуля BAS?

РЕДАКТИРОВАТЬ: поставить опцию Explicit в качестве первой строки модуля BAS и выполнить компиляцию (меню «Отладка» -> «Компиляция»).
Вы увидите, что есть ошибки компиляции.

Удалить Dim myRange As Range из Macro1 и Macro2.
Поместите его в верхнюю часть модуля BAS (после явной опции)

Примечание. Если переменная определена как часть SUB, другие SUB / функции не смогут ее использовать. Чтобы TieOut использовал myRange, он должен быть определен в области, где он может использоваться всеми SUB.

Кроме того, Macro1 должен запускаться первым - это присваивает значение MyRange (т.е. установить MyRange = .....)
Если Macro1 не запущен, MyRange не будет содержать значения и, следовательно, при попытке кода прочитать свойство (MyRange.Rows.Count) произойдет ошибка времени выполнения.

Пожалуйста, уделите немного времени прочтению о области видимости переменных.
Переменная должна содержать какое-то значение, прежде чем пытаться читать из нее.

...