#vba #excel
#vba #excel
Вопрос:
Мне нужен код, как следует из моего названия, для следующей задачи. Я уже перепробовал много другого кода, но он все еще не работает. Мне нужно только переместить 2 столбца, «SKU» и «Discount», на лист2 с помощью командной кнопки и сразу удалить его.
Я уже в порядке с этим кодированием. Однако, но проблема только начинается. Когда мне удается переместить первые данные и попытаться переместить 2-е данные, 1-е данные исчезают.
Я уже перепробовал много способов, но все еще не могу понять, что не так с кодом.
Пожалуйста, проверьте следующий код:
Sub OUTGOING_GOODS()
function1
function2
clear
Range_End_Method
End Sub
Sub function1()
Sheets("Invoice Print").Range("B21:B27").Copy Destination:=Sheets("Outgoing Goods").Range("D4")
End Sub
Sub function2()
Sheets("Invoice Print").Range("D21:D27").Copy Destination:=Sheets("Outgoing Goods").Range("L4")
End Sub
Sub clear()
Range("B21:B27").clear
End Sub
Мне также нужно изменить диапазон для входных данных. Как вы можете видеть, диапазон определен только из D21: D27, но мне нужно больше, чем строка 27, на случай, если будут введены дополнительные данные.
Уже пробовал следующий код:
With Worksheets("Sheet2")
LastRow = .Cells(.Rows.Count, "D").End(xlUp).Row
LastRow = .Cells(.Rows.Count, "L").End(xlUp).Row
For Each cell In Range("D4:D" amp; LastRow)
DestinationRow = LastRow 1
Next
For Each cell In Range("L4:L" amp; LastRow)
DestinationRow = LastRow 1
Next
End With
И
Lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = 1 To InputData
Lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
For j = 1 To 3
.Cells(lastrow 1, j).Value = InputData(i, j)
Next j
Next i
End With
Это все еще не работает.
Комментарии:
1. Какую версию вашего кода вы бы предпочли, чтобы мы рассмотрели? С каждым возможны разные проблемы. Общая проблема, которую я вижу в обоих, заключается в том, что вы ссылаетесь на
Cells
amp;Ranges
, не всегда включаяWorksheet
. Поскольку ваш макрос по своей сути работает с двумя листами, это отличный способ сделать что-то не так.2. первый код уже выполнен успешно. но когда я хочу отредактировать или добавить другой код, всегда возникает ошибка.
3. Я бы посоветовал обязательно добавить недостающие ссылки на листы и вместо использования
Destination
использоватьSheets("Outgoing Goods").Range("D4").PasteSpecial xlPasteAll
. Дайте нам знать, если это сработает.4. Что я должен сделать, чтобы добавить данные на лист 2 без удаления предыдущих данных? пожалуйста, помогите
5.
Sheets("Invoice Print").Range("B21:B27").Copy
затемSheets("Outgoing Goods").Range("D4").PasteSpecial xlPasteAll
следует скопировать данные из печати накладной на исходящие товары без внесения каких-либо изменений в печать накладной
Ответ №1:
Основываясь на наших обсуждениях на данный момент, я бы предложил следующее:
Sub Outgoing_Goods_New()
'
Dim Outgoing As Worksheet 'Generally it's better to use Worksheet variables. Saves the trouble of having to re-type the sheet name each time you reference the sheet
Dim Invoice As Worksheet
Dim LastRow_Invoice As Long
Dim LastRow_Outgoing As Long
Set Outgoing = ActiveWorkbook.Worksheets("Outgoing Goods")
Set Invoice = ActiveWorkbook.Worksheets("Invoice Print")
'Find the last row of Outgoing column D that's used so we know where to paste the new set of outgoing goods
LastRow_Outgoing = Outgoing.Range("D1048576").End(xlUp).Row
'Make sure column L of Outgoing ends at the same point
If Outgoing.Range("L1048576").End(xlUp).Row > LastRow_Outgoing Then
LastRow_Outgoing = Outgoing.Range("L1048576").End(xlUp).Row
End If 'else column L's last used row is farther up the worksheet or the same row. Either way no need to update the value
'Determine how much data to copy
LastRow_Invoice = Invoice.Range("B1048576").End(xlUp).Row 'I'm assuming Column D of Invoice Print has to end at the same row. If not, use the same IF statement as above, but
'checking column D of Invoice
'Copy the data from column B
Invoice.Range("B2:B" amp; LastRow_Invoice).Copy
'Paste to Outgoing Goods
Outgoing.Range("B" amp; LastRow_Outgoing).PasteSpecial xlPasteAll
'Copy Column D of Invoice
Invoice.Range("D2:D" amp; LastRow_Invoice).Copy
Outgoing.Range("L" amp; LastRow_Outgoing).PasteSpecial xlPasteAll
'Clear the data from Invoice print
Invoice.Range("B2:B" amp; LastRow_Invoice).ClearContents 'Removes the Value, but leaves formatting, comments, etc. alone
End Sub
В основном это та логика, которая у вас уже была, но я произвел некоторую очистку, чтобы устранить двусмысленности и немного обобщить логику. Также обратите внимание, что я не сохранил отдельные подразделы. При том, как мало вы делаете, просто нет никакой пользы от синтаксического анализа логики, особенно при том, что ни один код не используется повторно.
И последнее, я не удалял столбец D при печати накладной, предполагая, что в ячейках просто содержались формулы, которые извлекают новые данные на основе значений в столбце B. Если это не так, то, похоже, вам следует добавить второй ClearContents
для удаления столбца D, но это не точно, учитывая неопределенность вашего варианта использования.
Комментарии:
1. Привет, спасибо за вашу помощь. У меня уже есть ответ. Тем не менее, это все еще нужно немного исправить, поскольку выходные данные для этого кода
If Outgoing.Range("L1048576").End(xlUp).Row > LastRow_Outgoing Then LastRow_Outgoing = Outgoing.Range("L1048576").End(xlUp).Row End If