将数据从一个工作簿迁移到另一个工作簿。在新的工作簿中,我只想要特定的列(几乎是250)。由于Master文件中的数据不一致且不在同一范围内,因此如何提取这250列?因为,我是VBA的新手,我已经尝试了下面的代码,它正在工作,但我必须为所有250列编写长代码?任何帮助将不胜感激。
Sub Data_Migration()
Dim y As Workbook
Dim x As Workbook
Dim ws As Worksheet
Dim sh As Worksheet
Dim rng As Range
Set y = ThisWorkbook
Application.ScreenUpdating = 0
Set x = Workbooks.Open("file path")
'Column Q from master file with worksheet name cba is copied in new workbook with sheet name abc and pasted in column D
Set ws = y.Sheets("abc")
Set sh = x.Sheets("cba")
Set rng = sh.Range("Q2:Q11443")
rng.Copy
y.Sheets("abc").Range("D1").PasteSpecial xlValues
Application.CutCopyMode = False
Set ws = y.Sheets("abc")
Set sh = x.Sheets("cba")
Set rng = sh.Range("Z2:Z11443")
rng.Copy
y.Sheets("abc").Range("E1").PasteSpecial xlValues
Application.CutCopyMode = False
Set ws = y.Sheets("abc")
Set sh = x.Sheets("cba")
Set rng = sh.Range("AI2:AI11443")
rng.Copy
y.Sheets("abc").Range("F1").PasteSpecial xlValues
Application.CutCopyMode = False
x.Close
End sub
答案 0 :(得分:0)
你需要一个For .. Next循环。基本上,
Dim C As Long
For C = 1 to 250
' enter repetitive code here
Next C
如果C是您的列号,您可以使用C作为列号而不是“A”,“B”,“C”。 Excel不是很擅长写信。它将您键入的A转换为1,B转换为2,C转换为3等 - 最多250。
但是,您似乎不需要连续的列。因此,您需要创建所需数字的数组。
Dim Arr As Variant
Arr = Array(1, 12, 16, 25, 32) ' list all your 250 columns.
现在,Arr(0)= 1,Arr(1)= 12,Arr(2)= 16等。 并构建循环以引用这些数字。
Dim n As Integer
For n = 0 to Ubound(Arr) ' that the number of elements in Arr
C = Arr(n)
Debug.Print C ' this will write C in the immediate window
Next n
在此结构中,您可以使用C作为列号,例如
Set Rng = Sh.Range(Cells(3, C), Cells(11443, C))
单元格(3,C)指定A3,如果C = 1
PS刚刚想到你也可能需要这个: - 范围(“ZH2”)。列应返回“ZH”列的列号
答案 1 :(得分:0)
将以下代码粘贴到标准代码模块中(默认情况下为“Module1”,但您可以根据自己的喜好对其进行命名)。
Sub Main()
' 21 Mar 2017
Dim WsS As Worksheet ' S = Source
Dim WbT As Workbook, WsT As Worksheet ' T = Target
Dim Cs As Long, Ct As Long ' Column numbers: Source & Target
Dim Clms As Variant
Dim i As Integer ' index for Clms
Application.ScreenUpdating = False
On Error GoTo ErrExit
' Source is the first worksheet in the active workbook:
Set WsS = ActiveWorkbook.Worksheets("Haseev")
Set WbT = Workbooks.Add(xlWBATWorksheet)
Set WsT = WbT.Worksheets(1)
WsT.Name = "Extract 250" 'name the target sheet
Clms = Array(1, 4, 8, 13) ' list column numbers < 17
For i = 0 To UBound(Clms)
CopyColumn WsS, WsT, Clms(i), Ct
Next i
For Cs = 17 To Columns("CHU").Column Step 9
CopyColumn WsS, WsT, Cs, Ct
'''' If Ct > 10 Then Exit For
Next Cs
ErrExit:
Application.ScreenUpdating = True
End Sub
理解代码: - 使当前活动的工作簿成为“源”,这意味着您必须查看要从中复制数据的工作簿。代码期望在此工作簿中找到名为“Haseev”的工作表。更改代码中的名称或将整行代码更改为
Set WsS = ActiveWorkbook.Worksheets(1)
这指定了工作簿中的第一个工作表,因为像你这样的大型工作簿不太可能有太多的工作表。
代码将创建一个新工作簿,其中包含一个工作表。它将该表命名为“Extract 250”。将代码中的名称更改为您喜欢的名称。 接下来,代码将选定的列复制到新工作簿。
Clms = Array(1, 4, 8, 13)
您可以指定要复制的列 - 您需要的数量,以逗号分隔的数字。如果你不想要任何,只需将规范留空,例如RTI = Array()
在下一个循环中,复制每个第9列,从第17列开始到“CHU”列。您可以修改“CHU”。这条线
'''' If Ct > 10 Then Exit For
是我测试的遗留物。您可能希望将其用于同一目的。删除禁用代码的撇号,并且在将10列复制到新工作簿后,循环将停止复制。
您可能会注意到上述代码不包含任何副本或粘贴。相反,它会调用您应该粘贴在上面已复制的主过程下面的下一个子。
Private Sub CopyColumn(WsS As Worksheet, _
WsT As Worksheet, _
ByVal Cs As Long, _
Ct As Long)
' 21 Mar 2017
' Ct is a return Long
If Cs > 0 Then ' column number must be > 0
Ct = Ct + 1
WsS.Columns(Cs).Copy Destination:=WsT.Columns(Ct)
End If
End Sub
基本上,Main程序只管理这个sub将被调用的250多次。
输出工作簿将具有Excel给出的通用名称,如“Sheet1”。您可以将其保存在您希望的任何名称下,也可以将其关闭,并在下次查看时再创建一个新名称。