Макрос не работает при копировании и вставке кнопки макроса в другой лист - PullRequest
0 голосов
/ 17 апреля 2020

Я написал функцию GenerateCSV, которая записывает данные в файл CSV. Эта функция хранится в модуле («Модуль 1»). Я делюсь приведенным ниже кодом для полноты, но я думаю, что это не обязательно для моего вопроса.

Option Explicit

Sub GenerateCSV(ExcelStartRange As String, OutputFileName As String)

'Variable declaration
Dim Data As Variant
Dim MaxRow As Integer
Dim MaxColumn As Integer
Dim Row As Integer
Dim Column As Integer

Open OutputFileName For Output As #1

MaxRow = 2
MaxColumn = 722

For Row = 1 To MaxRow
    For Column = 1 To MaxColumn
        Data = Range(ExcelStartRange).Offset(Row - 1, Column - 1).Value

        If Column < MaxColumn Then
            Write #1, Data,
        Else
            Write #1, Data
        End If
    Next
    Application.StatusBar = "Row = " & Row
Next

Close #1

End Sub

Я также написал макрос на листе «OutputCFs», который вызывает GenerateCSV:

Private Sub CommandButton1_Click()
    Call GenerateCSV(Range("StartRange1"), Range("OutputFileName1"))
    Call GenerateCSV(Range("StartRange3"), Range("OutputFileName3"))

End Sub

Когда я нажимаю кнопку макроса в «OutputCFs», она работает нормально. Однако, когда я перемещаю / копирую и вставляю кнопку макроса в другой лист (скажем, «Руководство»), она больше не работает.

Что я должен добавить в свой код, чтобы кнопка макроса могла также работайте на листе «Руководство».

Спасибо.

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Проблема ...

... в том, что в

GenerateCSV(Range("StartRange1"), Range("OutputFileName1"))

вы не указали точно, в каком листе находятся ваши диапазоны. Так что Excel начинает угадывать, какой лист вы имели в виду, и иногда он ошибается. Таким образом, в зависимости от того, какой лист является активным или где именно этот код написан, процедура гадания в Excel меняется, и это мешает.

Решение

Для все Range, Cells, Columns, Rows объекты (и другие объекты, расположенные на листе) всегда явно указывают, в какой книге и листе они находятся, чтобы предотвратить предположения и предположения Excel.

GenerateCSV ThisWorkbook.Worksheets("OutputCFs").Range("StartRange1"), ThisWorkbook.Worksheets("OutputCFs").Range("OutputFileName1")

Это надежно и гарантирует, что оно всегда будет работать с этой специфицированной c рабочей книгой ThisWorkbook с указанным c рабочим листом Worksheets("OutputCFs"). Теперь в Excel нет места угадыванию или предположениям. У Excel очень четкое утверждение, и оно будет следовать ему. Чем точнее вы будете в своем коде, тем точнее будет следовать Excel.

Настоятельно рекомендуется всегда , делайте это для всех ваших объектов, расположенных на листах, иначе вы никогда не узнаете, когда он может начать сбоить .
Если у вас есть больше кода go, проверьте его немедленно и укажите все рабочие книги правильно.


Рекомендация

Если вам нужна некоторая поддержка в этом вопросе, и вы пишете чистый и * Код 1045 * посмотрите на Rubberduck AddIn для VBA. Он может автоматически предупредить вас, если у вас есть диапазоны без указания рабочего листа. Он сказал бы, что

Член 'Range' неявно ссылается на 'ActiveSheet'.

в своем Инспекторе кода. Также в Rubberduck есть много других полезных вещей.

0 голосов
/ 17 апреля 2020

Одна проблема состоит в том, что GenerateCSV() ожидает String в качестве ввода, а код вашей кнопки дает ему Range() Объект в качестве ввода.

РЕДАКТИРОВАНИЕ # 1:

Это может привести к проблемам. Например, если Range("StartRange1") имеет значение A1, то код кнопки будет предполагать, что это означает A1 на том же листе, где кнопка включена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...