首页 > 解决方案 > 寻找一个循环解决方案,从主 ws 复制到工作簿中的每个空工作表

问题描述

我在这里完全不知所措。还不够好,甚至无法尝试对此进行编码。这是我希望实现的目标:

在工作簿中,我有一个宏,它从 CSV 文件中提取数据并将其复制到“主数据”工作表中,然后再次复制到“临时”工作表中,同时将“临时”中的标题格式化为我需要的内容(A 行和 B 行将需要在所有工作表中保持不变。这已经过去了(在你们自己的帮助下)。然后宏根据 input.box 创建 x 数量的空工作表。现在我需要编写两件事:

  1. 将“Temp”工作表中的前两行复制到由 input.box 创建的所有空工作表中(数字未确定,因为它不会保持不变)

  2. 将 C 行中的数据范围剪切并粘贴到“Temp”工作表中的数据末尾,逐行粘贴到 input.box 创建的所有工作表中,以便将 C 行复制到 sheet2 中的第一个空行,将 D 行复制到第一个空行在 sheet3 中的行,依此类推,直到不再需要剪切和粘贴数据。它将需要遍历工作簿中具有默认名称(sheet2、sheet3 等)的所有工作表。工作簿中的此类工作表不会超过 10 个。

老实说,我什至不知道从哪里开始,我不擅长循环,尤其是那些看起来如此复杂的循环。

到目前为止,这是我设法整理的内容。只有几个模块可以让我写到上面的内容。我意识到我的代码并不优雅,它的一部分也不是我自己的,因为我已经在这里寻求帮助并收到了它。

Sub Import_CSV_File()
Dim ws As Worksheet, strFile As String

Set ws = ActiveWorkbook.Sheets("Sheet1")
strFile = Application.GetOpenFilename("Text Files (*.csv),*.csv", ,
  "Please select .csv file...")

With ws.QueryTables.Add(Connection:="TEXT;" & strFile,     
Destination:=ws.Range("A1"))
 .TextFileParseType = xlDelimited
 .TextFileCommaDelimiter = True
 .Refresh
ActiveSheet.Name = "Master Data"
Worksheets("Master Data").Rows(2).EntireRow.Delete

End With
End Sub

Sub Sort_Data_by_Price_Descending()
Columns("A:Q").Sort key1:=Range("G:G"), order1:=xlDescending,     
Header:=xlYes
End Sub

Sub Create_Sheet_and_Copy_Master_Data()

Dim ws As Worksheet
With ThisWorkbook
    Set ws = .Sheets.Add(After:=.Sheets(.Sheets.Count))
    ws.Name = "Temp"
    Sheets("Master Data").Cells.Copy Destination:=Sheets("Temp").Range("A1")
    Range("A1:Z1") = Array("Code", "Carrier", "Operator", "CardNo", "ExpDate", "Comment1", "OrdAmount", "OrdNo", "OrdDate", "CustNo", "DOB", "Name", "Add1", "Add2", "Add3", " ", " ", " ", "Redline", "ISS", "CCN", "Add Links", "AVS", "Referrals", "Comments", "Verified?")
    Rows("1:1").Insert Shift:=xlDown, _
    CopyOrigin:=xlFormatFromLeftOrAbove
    Range("A1:K1") = Array("Batch No.", " ", "Carrier", " ", "Orders", " ", "Start Time", " ", "End Time", " ", "Batch ID")
End With
End Sub

Sub AddSheets_via_Input_Box()

Dim numberOfSheets As Integer
numberOfSheets = CInt(Trim$(InputBox("...how many people are working Fraud Today?", "Tell me…", 1)))
If IsNumeric(numberOfSheets) Then
With ActiveWorkbook
    .Sheets.Add After:=.Sheets("Temp"), Count:=numberOfSheets
End With
Else
    MsgBox "Invalid parameter supplied - use numbers only"
End If

标签: excelvba

解决方案


这应该适用于您的第一个问题。它不需要知道输入框捕获的数字。它将在跳过Master Data和时循环遍历所有工作表Temp

Sub Top2Rows()

Dim Temp As Worksheet: Set Temp = ThisWorkbook.Sheets("Temp")
Dim ws As Worksheet

For Each ws In Worksheets
Temp.Range("A1:Z2").Copy
    If ws.Name <> "Temp" And ws.Name <> "Master Data" Then
        ws.Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
        ws.Range("A1").PasteSpecial xlPasteFormats
    End If
Next ws

End Sub

希望您能弄清楚如何将类似的逻辑应用于您的下一张纸。我会做什么(如果我正确理解了#2的要求)是:

  1. 确定您有多少行
  2. 确定您有多少目标工作表 ( ThisWorkbook.Sheets.Count - 2)
  3. 创建一些循环以将范围添加到Union(循环数由您拥有的目标工作表数量决定)
  4. 复制/粘贴Union.EntireRow单元格,而不是逐行执行此操作。

您还可以创建一个编号系统并使用过滤器来做同样的事情。无论哪种方式,您都希望避免逐行执行此操作。

祝你好运!


推荐阅读