Должна быть простая процедура цикла в VBA - PullRequest
2 голосов
/ 25 марта 2012

В Excel у меня есть колонка слов.Я полагаю, что вы называете слова «строки» в мире программирования.

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

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

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

Мой код ниже,Сообщение об ошибке гласит «индекс за пределами диапазона», но, как вы можете видеть, я затемнил массив.Что я делаю неправильно?Спасибо.

    Sub putquotes()
    Dim sym(1 To 162) As String
    For i = 1 To 162
       sym(i) = Worksheets("sheet1").Cells(i + 1, 1)
    Next i
    End Sub

Ответы [ 3 ]

3 голосов
/ 25 марта 2012

Я думаю, что ваша проблема - ваше sheet1 имя, которое, вероятно, должно быть Sheet1

Я бы использовал что-то вроде этого, которое будет выполняться на первом листе (см. Set ws = Sheets(1))

Обратите внимание, что третий лист будет Set ws = Sheets(3), или вы можете использовать Set ws = Sheets("Sheet1"), если у вас есть такой лист

Этот код:

  • будет работать независимо от выбранного листа
  • выглядит от первой до последней использованной ячейки в столбце A (вместо жесткого кодирования 162 строк)
  • использует различные массивы, а не диапазоны для скорости
  • добавляет двойной '', чтобы убедиться, что первый виден:)

    Sub PutQuotes()
    Dim ws As Worksheet
    Dim varList
    Dim rng1 As Range
    Dim lngCnt As Long
    Set ws = Sheets(1)
    Set rng1 = ws.Range(ws.[a1], ws.Cells(Rows.Count, "A").End(xlUp))
    varList = rng1.Value2
    
    For lngCnt = 1 To UBound(varList)
        If Len(varList(lngCnt, 1)) > 0 Then _
            varList(lngCnt, 1) = "''" & varList(lngCnt, 1) & "'"
    Next
    'dump updated array back over range
    rng1.Value2 = varList
    End Sub
    
2 голосов
/ 25 марта 2012

У вас нет листа с именем "Sheet1".Либо:

  1. Этот код находится в стандартном модуле в книге с данными, и вы переименовали лист, либо
  2. Код находится в другой книге, и вы неправильно квалифицировал ваше свойство Worksheets

Я собираюсь предположить последнее.Когда вы используете свойства коллекции, такие как Worksheets или Cells, Excel делает предположения о том, кто является родителем.Неквалифицированный вызов Worksheets в стандартном модуле примет

ActiveWorkbook.Worksheets()

Неквалифицированный вызов Worksheets в модуле ThisWorkbook примет

ThisWorkbook.Worksheets()

Чтобы проверить, в чем проблема, добавьте эту строку в свойкод

Debug.Print Worksheets("Sheet1").Parent.Name

Он скажет вам, какая книга Excel используется, и может отличаться от того, что вы хотите.

Чтобы избежать неправильных предположений, лучше полностью квалифицировать ваши ссылки.Например, если вы открываете книгу с данными, это может выглядеть следующим образом:

Sub putquotes()

    Dim wb As Workbook
    Dim sym(1 To 162) As String
    Dim i As Long

    Set wb = Workbooks.Open("Path\Name")

    For i = 1 To 162
        sym(i) = wb.Sheets("Sheet1").Cells(i + 1, 1)
    Next i

End Sub

Удержание этой ссылки в wb - простой способ определить ссылку.Если вы не открываете отдельный файл в коде, вы можете просто явно указать, как

ThisWorkbook.Worksheets("Sheet1")
ActiveWorkbook.Worksheets("Sheet1")
Workbooks("Mybook.xlsx").Worksheets("Sheet1")

Лучший способ чтения значений ячеек в массив выглядит так:

Sub putquotes()

    Dim wb As Workbook
    Dim sym As Variant
    Dim i As Long

    Set wb = Workbooks.Open("Path\Name")
    sym = wb.Sheets("Sheet1").Range("A2").Resize(162, 1).Value

    For i = LBound(sym, 1) To UBound(sym, 1)
        Debug.Print "'" & sym(i, 1) & "'"
    Next i

End Sub

Тодаст вам двумерный массив base-1, который вам может не понравиться, но это быстрее, чем читать их по одному за раз.

1 голос
/ 25 марта 2012

Полагаю, вы хотите что-то подобное ...

Public Sub DoQuotes()
    Dim iRow As Integer
    Dim Result() As String
    iRow = 1

    Do While Not IsEmpty(Sheet1.Cells(iRow, 1))
        ReDim Preserve Result(iRow - 1)
        Result(iRow - 1) = "'" & Sheet1.Cells(iRow, 1) & "'"
    iRow = iRow + 1
    Loop

    For Each x In Result
        MsgBox (x)
    Next x

End Sub

Однако имейте в виду, что Excel будет воспринимать первую кавычку как разделитель текста, поэтому значение в массиве равно «что-то».в Excel это будет выглядеть как-то '.

Просто в качестве общей точки, старайтесь избегать обращений к Worksheets (), вместо этого используйте строго типизированный объект Sheet1 - сохраняет все виды будущей боли, если рабочие таблицы будут переименованы.Вы можете увидеть, как эти листы действительно называются в редакторе vba.Будет сказано что-то вроде Sheet1 (MyWorksheet)

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