Объединить неизвестное количество клеток - PullRequest
0 голосов
/ 24 октября 2018

Это продолжение вопроса из моего исходного вопроса, которое помогло мне решить первую часть моего сценария: Автозаполнение неизвестного количества ячеек .

Вторая часть моего сценарияобъединить неизвестное количество ячеек.Используя логику из первого вопроса, я пытался изменить свой сценарий на этот myconcatenate = ActiveCell.FormulaArray = "=Concatenate("A5", mylastcell_4)", но это приводит к синтаксической ошибке .

Первоначально мне дали этот фрагмент сценария, которыйработал нормально сам по себе, но не работает при добавлении в конец моего скрипта

  Do
    myconcatenate = myconcatenate & ActiveCell.Value
    ActiveCell.Offset(0, 1).Select
  Loop Until ActiveCell.Address = mylastcell_5

  Range("A5").Select
  ActiveCell.Value = myconcatenate

Это дает ошибка времени выполнения '1004' Ошибка приложения или объекта и перейдет к самой последней ячейке в строке 5 (хотя у меня только 5 в настоящее время занято в строке 1) и ничего не делает, пока она проходит через все ячейки.Иногда он выполняет первый бит сценария (добавляет '' к значениям ячейки), а иногда нет.

Вот мой полный сценарий для контекста: Снимок экрана полного сценария

В конечном итоге я пытаюсь перейти из списка abcdedf в «a», «b», «c», «d», «e», «f», в одну ячейку.

Изображение конечной цели:
Ultimate goal picture
строка 5, ячейка D, дает окончательный ответ, который мне нужен, E5 будет mylastcell_5

Это мой первый деньна VBA, и я потратил целый день на поиски ответов на вопросы, но это ничего не дало для меня.

ОБНОВЛЕНИЕ: Я объявил mylastcell_5, который у меня не былоне было сделано ранее.Теперь я не получаю ошибки в сценарии, и он просто зависает на A5, а не идет в самый конец страницы, но на самом деле он не объединяется.

Так что я думаю, что каким-то образомМне нужно изменить цикл так, чтобы он записывал в строку 5, а читал из строки 4 ... но я не знаю, как это сделать.

Option Explicit
Sub concat()
'
' concat Macro
' 'text','text'
'
' Keyboard Shortcut: Ctrl+Shift+C
'
With ThisWorkbook.Worksheets("Sheet1")
Dim mylastcell_1 As String, mylastcell_2 As String, mylastcell_3 As String, mylastcell_4 As String, mylastcell_5 As String, myconcatenate As String, myconcatenate1 As String
    Range("A1").Select
    Selection.End(xlToRight).Select
    mylastcell_1 = ActiveCell.Address

    Range(mylastcell_1).Select
    ActiveCell.Offset(1, 0).Select
    mylastcell_2 = ActiveCell.Address

    Range(mylastcell_2).Select
    ActiveCell.Offset(1, 0).Select
    mylastcell_3 = ActiveCell.Address

    Range(mylastcell_3).Select
    ActiveCell.Offset(1, 0).Select
    mylastcell_4 = ActiveCell.Address

    Range(mylastcell_4).Select
    ActiveCell.Offset(1, 0).Select
    mylastcell_5 = ActiveCell.Address

    myconcatenate = ActiveCell.Value
    ActiveCell.Offset(0, 1).Select


    Range("A2").Select
    Selection.End(xlToRight).Select
    Range("A2").Select
    Range("A2", mylastcell_2).Select
    Selection.FormulaArray = "''"
    Range("A3").Select
    Range("A3", mylastcell_3).Select
    Selection.FormulaArray = "'',"
    Range("A4").Select
    ActiveCell.FormulaR1C1 = "=CONCATENATE(R[-2]C,R[-3]C,R[-1]C)"
    Range("A4").Select
   .Range(.Cells(4, "A"), .Cells(1, .Columns.Count).End(xlToLeft).Offset(3, 0)).Formula = "=concatenate(a2, a1, a3)"
    Range("A5").Select

Do
        myconcatenate = myconcatenate & ActiveCell.Value
        ActiveCell.Offset(0, 1).Select

    Loop Until ActiveCell.Address = mylastcell_5

    Range("A5").Select
    ActiveCell.Value = myconcatenate




End With
End Sub

1 Ответ

0 голосов
/ 24 октября 2018

Я не знаю, планируете ли вы всегда объединять элементы в одиночную кавычку, заключенную в запятую, но если вы это сделаете, есть несколько способов сделать это (я нашел это полезным для быстрой вставки вещей вОператоры SQL, например).Один соединяет вертикальные строки (один столбец), а второй соединяет горизонтальные строки (один ряд).Это была бы стандартная функция рабочего листа, где вы должны ввести что-то вроде =hjoin(a1:h1) или =vjoin(a1:a7)

Function hJoin(inRng As Range) As String
Dim c As Range
Dim outStr As String
Dim rng As Range

Set rng = Range(inRng.Address)


For Each c In rng.Columns
    If c.Address = rng.Cells(rng.Cells.Count).Address Then
            outStr = outStr & " '" & c.Value & "'"
        Else
            outStr = outStr & " '" & c.Value & "',"
        End If
    Next c

hJoin = outStr

End Function

Function vJoin(inRng As Range) As String
Dim c As Range
Dim outStr As String
Dim rng As Range

Set rng = Range(inRng.Address)


For Each c In rng.Rows
    If c.Address = rng.Cells(rng.Cells.Count).Address Then
         outStr = outStr & " '" & c.Value & "'"
    Else
         outStr = outStr & " '" & c.Value & "',"
    End If
Next c

vJoin = outStr

End Function
...