Копирование и преобразование данных из рабочего листа A в рабочий лист B - PullRequest
0 голосов
/ 24 марта 2020

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

Чтобы быть более точным c, 1-е: Необработанные данные сначала вставляются в лист, называемый «Вставить целевые данные здесь». 2-й: оттуда «преобразованный» лист с формулами Excel в каждом столбце будет принимать значение из PTDH-листа и преобразовывать данные в некоторые заданные значения c (в зависимости от функции, используемой в каждом столбце) 3-й: Теперь моя команда пришлось бы копировать и вставлять в качестве значения все на «преобразованном» листе в «мастер-лист», в котором точный порядок столбцов совпадает с «преобразованным».

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

Вот что у меня есть в моем модуле:

Sub UpdateMaster()
Dim r As Range
Dim wsMaster As Worksheet, wsSAP as Worksheet
Dim LastR As Integer

If MsgBox("Update data from 'SAP' to 'Master Worksheet'?", _
vbYesNo + vbQuestion +vbDefaultButton2, "Update Master") = vbNo Then
   Exit Sub
End If

Set wsMaster = Thisworkbook.Worksheets("Master Worksheet")
Set wsSAP = ThisWorkbook.Worksheets("SAP")

LastR = wsSAP.Columns("J:J, X:X, AA:AD, AI:AM, AP:AP, AY:AY").Find(What:="*",_
SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row

'Turn Off Events
   Application.EnableEvents = False
'Get rid of old data
   wsMaster.Cells.ClearContents
'Copy Columns from SAP to Master
   wsSAP.Range("AY2:AY" & LastR).Copy Destination:=wsMaster.Range("A2")
   wsSAP.Range("C2:C" & LastR).Copy Destination:=wsMaster.Range("B2")
   'Code for Column C here - use If statement
   wsSAP.Range("AB2:AB" & LastR).Copy Destination:=wsMaster.Range("D2")
   wsSAP.Range("AA2:AA" & LastR).Copy Destination:=wsMaster.Range("E2")
   wsSAP.Range("AC2:AC" & LastR).Copy Destination:=wsMaster.Range("F2")
   wsSAP.Range("AD2:AD" & LastR).Copy Destination:=wsMaster.Range("G2")
   wsSAP.Range("AI2:AI" & LastR).Copy Destination:=wsMaster.Range("H2")
   wsSAP.Range("AJ2:AJ" & LastR).Copy Destination:=wsMaster.Range("I2")
   wsSAP.Range("AK2:AK" & LastR).Copy Destination:=wsMaster.Range("J2")
   wsSAP.Range("AL2:AL" & LastR).Copy Destination:=wsMaster.Range("K2")
   wsSAP.Range("AP2:AP" & LastR).Copy Destination:=wsMaster.Range("L2")
   'Code for Column M here - use If statement
   'Code for Column AU here - use If statement
   'Code for Column AV here - use If statement
   'Code for Column AW here - use If statement
   'Code for Column AX here - use If statement


'Add formulas
 Set r = wsMaster.Cells(1, 1).CurrentRegion.Columns(17)
 Set r = r.Cells(2, 1).Resize(r.Rows.Count - 1, r.Columns.Count)
 r.Formula = "=IF(AND(N2=""Podding"", O2=""Rollup""),""Podding"",IF(O2=N2,""Sales/Production"",IF(P2=O2,""Production"",IF(P2=N2,""Sales"",""""))))"

 Set r = wsMaster.Cells(1, 1).CurrentRegion.Columns(21)
 Set r = r.Cells(2, 1).Resize(r.Rows.Count - 1, r.Columns.Count)
 r.Formula = "=IF(AND(R2=""Podding"", S2=""Rollup""),""Podding"",IF(AND(R2=""Shipped"", S2=""Rollup""),""Sales/Production"",IF(R2=S2,""Sales/Production"",IF(S2=T2,""Production"",IF(R2=T2,""Sales"","""")))))"

 Set r = wsMaster.Cells(1, 1).CurrentRegion.Columns(25)
 Set r = r.Cells(2, 1).Resize(r.Rows.Count - 1, r.Columns.Count)
 r.Formula = "=IF(AND(V2=""Podding"", W2=""Rollup""),""Podding"",IF(AND(V2=""Shipped"", W2=""Rollup""),""Sales/Production"",IF(V2=W2,""Sales/Production"",IF(W2=X2,""Production"",IF(V2=X2,""Sales"","""")))))"

 Set r = wsMaster.Cells(1, 1).CurrentRegion.Columns(29)
 Set r = r.Cells(2, 1).Resize(r.Rows.Count - 1, r.Columns.Count)
 r.Formula = "=IF(AND(Z2=""Podding"", AA2=""Rollup""),""Podding"",IF(AND(Z2=""Shipped"", AA2=""Rollup""),""Sales/Production"",IF(Z2=AA2,""Sales/Production"",IF(AA2=AB2,""Production"",IF(Z2=AB2,""Sales"","""")))))"

 Set r = wsMaster.Cells(1, 1).CurrentRegion.Columns(33)
 Set r = r.Cells(2, 1).Resize(r.Rows.Count - 1, r.Columns.Count)
 r.Formula = "=IF(AND(AD2=""Podding"", AE2=""Rollup""),""Podding"",IF(AND(AD2=""Shipped"", AE2=""Rollup""),""Sales/Production"",IF(AD2=AE2,""Sales/Production"",IF(AE2=AF2,""Production"",IF(AD2=AF2,""Sales"","""")))))"

 Set r = wsMaster.Cells(1, 1).CurrentRegion.Columns(37)
 Set r = r.Cells(2, 1).Resize(r.Rows.Count - 1, r.Columns.Count)
 r.Formula = "=IF(AND(AH2=""Podding"", AI2=""Rollup""),""Podding"",IF(AND(AH2=""Shipped"", AI2=""Rollup""),""Sales/Production"",IF(AH2=AI2,""Sales/Production"",IF(AI2=AJ2,""Production"",IF(AH2=AJ2,""Sales"","""")))))"

 Set r = wsMaster.Cells(1, 1).CurrentRegion.Columns(41)
 Set r = r.Cells(2, 1).Resize(r.Rows.Count - 1, r.Columns.Count)
 r.Formula = "=IF(AND(AL2=""Podding"", AM2=""Rollup""),""Podding"",IF(AND(AL2=""Shipped"", AM2=""Rollup""),""Sales/Production"",IF(AL2=AM2,""Sales/Production"",IF(AM2=AN2,""Production"",IF(AL2=AN2,""Sales"","""")))))"

 Set r = wsMaster.Cells(1, 1).CurrentRegion.Columns(45)
 Set r = r.Cells(2, 1).Resize(r.Rows.Count - 1, r.Columns.Count)
 r.Formula = "=IF(AND(AP2=""Podding"", AQ2=""Rollup""),""Podding"",IF(AND(AP2=""Shipped"", AQ2=""Rollup""),""Sales/Production"",IF(AP2=AQ2,""Sales/Production"",IF(AQ2=AR2,""Production"",IF(AP2=AR2,""Sales"","""")))))"

'Turn On Events
   Application.EnableEvents = True

End Sub

1) Моя первая проблема заключается в том, что для этой части кодов wsSAP.Range("AB2:AB" & LastR).Copy Destination:=wsMaster.Range("D2") у меня есть много похожих строк, в которых я хотел скопировать 1 столбец в «SAP» в другой столбец в «Основной рабочей таблице». Однако я понял, что это не самый лучший способ, поскольку я точно знаю, что в столбце AB в «SAP» не будет пустых / пустых ячеек от первой строки до последней строки. Однако это не относится к другим столбцам. Некоторые столбцы могут иметь пустые / пустые ячейки где-то в пределах своих диапазонов данных, и мой LastR может принять его как последнюю непустую ячейку и остановиться там, не копируя остальные ячейки.

Есть ли способ решить эту проблему?

2) Моя вторая проблема , у меня возникают проблемы при включении следующих операторов If в мои текущие коды. Особенно в части, использовать ли Ifs в VBA или вставлять формулы в каждую ячейку, как я делал в одной части моих кодов. Какой из них лучше по времени обработки, и можете ли вы сообщить, как я могу добавить их в свои текущие коды?

Для комментария 'Code for Column C here - Use If Statement, как я могу преобразовать следующую формулу в соответствующие коды VBA, если она имеет более быстрое время обработки по сравнению со вставкой формул в ячейки?

=IF((OR('SAP'!J2="Spare", 'SAP'!J2="Pool",'SAP'!J2="FEP")), "A/M", 'SAP'!J2)

Не могли бы вы посоветовать?

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