我对VBA没有太多经验,但我会从解释我的情况开始。
我有一张341张的工作簿。每张纸的布局相同,因为它们占据空间A1:J48。我需要将所有这些组合成一张名为“COMBINATION”的表格。相关信息来自A10:J48。我还需要从A1:J9获取单元格,因为它们是所有工作表共享的标题。
我所做的是编写一个代码复制A1:J48 for Sheet1(获取标题和信息)并将其粘贴到“COMBINATION”中,粘贴特殊为文本,然后是代码转到Sheet2并从A10复制:J48并将其粘贴到“COMBINATION”列A的第一个空单元格中。
这让我想到了我的问题。我已经意识到必须有一种更简单的方法,而不是为每张纸复制代码339次。
见下面的代码。它做了我想要的正确但是如上所述,我想找到一种不再做339次的方法......
Sheets("Sheet1").Select
Range("A1:J48").Select
Selection.Copy
Sheets("COMBINATION").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Selection.Columns.AutoFit
Sheets("Sheet2").Select
Range("A10:J10").Select
Range("J10").Activate
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("COMBINATION").Select
NextFree = Range("A10:A" & Rows.Count).Cells.SpecialCells(xlCellTypeBlanks).Row
Range("A" & NextFree).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
答案 0 :(得分:0)
我会使用如下代码:
PHP >= 7
如果您的工作表并非始终包含所有39行(10到48)中的数据,请将Dim ws As Worksheet
Dim r As Long
'Copy A1:J9 from the first sheet
Worksheets("Sheet1").Range("A1:J9").Copy
WorkSheets("COMBINATION").Range("A1").PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=False
'Now loop through every sheet (except "COMBINATION") copying cells A10:J48
r = 10 ' first sheet will be copied to row 10 in COMBINATION
For Each ws In Worksheets
If ws.Name <> "COMBINATION" Then
ws.Range("A10:J48").Copy
Worksheets("COMBINATION").Range("A" & r).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=False
'Set pointer ready for next sheet
r = r + 39
End If
Next
'Set column widths
Worksheets("COMBINATION").Columns.AutoFit
替换为
r = r + 39
答案 1 :(得分:0)
将重复代码放入循环(未经测试):
usr/bin/i686-w64-mingw32.static-pkg-config Qt5Widgets --libs
答案 2 :(得分:0)
Range.PasteSpecial xlPasteValues
很方便但很慢。定义你的目标&#39;要快得多。范围与源范围相同,并进行直接分配。
Sub CombineData()
Application.ScreenUpdating = False
Dim ws As Worksheet
Dim Target As Range
With Worksheets("COMBINATION")
.Range("A1:J9").Value = Worksheets("Sheet1").Range("A1:J49").Value
For Each ws In Worksheets
If ws.Name <> .Name Then
Set Target = .Range("A" & .Rows.Count).End(xlUp).Offset(1)
Target.Resize(39, 10).Value = ws.Range("A10:J48").Value
End If
Next
End With
Application.ScreenUpdating = True
End Sub