Копировать строку на основе текста в оригинальном виде - PullRequest
0 голосов
/ 09 октября 2018

Я некоторое время искал ответ на этот вопрос и подошел очень близко.

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

Я натолкнулся на следующее здесь сегодня утром, которое является самым близким, которое я достиг, но яне понимаю достаточно кода, чтобы он соответствовал моим потребностям (или, возможно, это даже не самый лучший метод?)

Код, который я нашел:

Sub SmartCopy()
    Dim s1 As Worksheet, s2 As Worksheet
    Dim N As Long, i As Long, j As Long
    Set s1 = Sheets("Order")
    Set s2 = Sheets("Converted")
    N = s1.Cells(Rows.Count, "C").End(xlUp).Row
    j = 1
    For i = 1 To N
        If s1.Cells(i, "C").Value = "" Then
        Else
            s1.Cells(i, "C").EntireRow.Copy s2.Cells(j, l)
            j = j + 1
        End If
    Next i
End Sub

В моей формеколичество начинается с E15 (заказанные детали находятся в колонках перед рукой).Если E15 имеет значение, то формула должна быть скопирована в следующую строку и так далее.Если количество следующей строки не заполнено, мне нужно удалить любую введенную формулу.Таким образом, в сущности, заполнение только в том случае, если в исходном листе есть значение в количестве, поскольку в конце также должна быть одна строка.Я могу выполнить последнюю часть, но любой код, который я обнаружил ранее, входит в формулу, поэтому, конечно, ячейка не становится пустой и вызывает другие проблемы, следовательно, спрашивая, можно ли это сделать таким образом ?.

Это копия формы.Вы заметите, что значения начинаются с A15 для номера детали, и весь ряд информации понадобится, если что-то будет заказано в следующей строке.

enter image description here

Это конвертированная версия, как вы видите, она заполняется, но мне нужно скопировать, как описано.

enter image description here

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

Sub ButtonMacro()
'Hide alerts
  Application.DisplayAlerts = False

'Add new sheet for table
  Sheets.Add.Name = "Converted"

'Populate new worksheet
    Range("A1").Formula = "MSG"
    Range("B1").Formula = "=Order!F2"
    Range("C1").Formula = "ORDER"
    Range("D1").Formula = "1400008000"
    Range("E1").Formula = "501346009175"
    Range("F1").Formula = "=TODAY()"
    Range("F1").Select
        Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("G1").Formula = "=Now()"
    Range("G1").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Selection.NumberFormat = "[$-x-systime]h:mm:ss AM/PM"
    Range("A2").Formula = "HDR"
    Range("B2").Formula = "C"
    Range("C2").Formula = "1400011281"
    Range("G2").Formula = "=Order!F2"
    Range("H2").Formula = "=Order!D2"
    Range("K2").Formula = "STD"
    Range("L2").Formula = "=Order!F5"
    Range("N2").Formula = "=Order!F7"
    Range("O2").Formula = "=Order!F8"
    Range("Q2").Formula = "=Order!F9"
    Range("R2").Formula = "=Order!F12"
    Range("A3").Formula = "POS"
    Range("B3").Formula = "=ROW()*10-20"
    Range("B3").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("C3").Formula = "=Order!C15"
    Range("D3").Formula = "=Order!A15"
    Range("E3").Formula = "=Order!B15"
    Range("F3").Formula = "=Order!E15"
    Range("G3").Formula = "=Order!G15"
    Range("H3").Formula = "=IF(Order!H15<1,"""",""GBP"")"
    Range("M3").Formula = "=COUNTIF(C[-3], ""POS"")+COUNTIF(C[-3], ""HDR"")"

'Fills column to last row of data from Cell C3
    Dim LastRow As Long
    LastRow = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    Range("C3:H3" & LastRow).FillDown

'Find last blank in A and fill with TRA
    Cells(Application.Evaluate("MAX(IF(C3:C2000<>"""",ROW(c3:c2000)),0,1)"), "A").Select
    ActiveCell = "TRA"

'Format cells to remove 0 value
    Range("A1:Z1000").Select
    Range("Z1000").Activate
    Selection.NumberFormat = "#;#;"

'Reinstate alerts
Application.DisplayAlerts = True
MsgBox "We have saved a copy of your order form to your computer at C:\X\X"
End Sub

Раздел "Заполняет столбец до последней строки данных из ячейки C3" - это то, что в настоящее время не делает то, что мне нужно.

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

Примеры:
Форма клиента заполнена и готова к преобразованиюClient form

Конвертированная форма (от которой я пытаюсь избавиться от желтого цвета) Converted version

Так что в конвертированнойверсию, вы увидите TRA в строке 33. Это потому, что текущий метод копирует вниз и ищет следующую пустую ячейку, так как они имеют формулу, они не являются пустыми, следовательно, спрашивая, можно ли это сделать таким образом.Надеюсь, это поможет?

1 Ответ

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

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

Ваш код добавляет именованный лист, но почти все последующее относится к диапазону, которого нет в листе, который вы только что создали.Вам нужно будет указать имя рабочего листа, и здесь будет полезно использовать блок with.В вашем случае:

'Add new sheet for table
  Sheets.Add.Name = "Converted"
With worksheets("Converted")
'Populate new worksheet
    .Range("A1") = "MSG"
    .Range("B1").formula = "=Order!F2"
    .Range("C1") = "ORDER"
    .Range("D1") = "1400008000"
    .Range("E1") = "501346009175"
End with

(обратите внимание на точки перед .range)
Предполагается, что у вас открыта только одна рабочая книга.Если нет, укажите это тоже!Workbooks("Orders.xlsx").Worksheets("Converted").range("A1")
Неспецифичные диапазоны, вероятно, являются причиной нескольких пустых строк на текущем листе - компилятор считает строки на одном листе, хранит этот номер строки в памяти, выбирая какой-то другой лист на основе .activate и создание значения в строке этого листа.

Если вы хотите найти последнюю строку в столбце «A», в которой есть непустое значение, используйте lastrow = Worksheets("Converted").Cells(.rows.Count, "A").End(xlUp).Row

Удачи!

...