Ищем циклическое решение для копирования с главного ws на каждый пустой лист в книге - PullRequest
0 голосов
/ 17 сентября 2018

Я полностью растерялся здесь.Недостаточно, чтобы даже попытаться написать это.Вот что я надеюсь достичь:

В рабочей книге у меня есть макрос, который извлекает данные из CSV-файла и копирует их в рабочую таблицу «Основные данные» и снова в рабочую таблицу «Temp» с одновременным форматированием.заголовки в «Temp» к тому, что мне нужно (строки A и B, которые должны оставаться постоянными на всех листах. Это прошло (с некоторой помощью от вас) хорошо. Макрос затем создает x количество пустых листов на основе input.boxТеперь мне нужно написать две вещи:

  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

1 Ответ

0 голосов
/ 18 сентября 2018

Это должно сработать для вашего первого запроса. Для этого не нужно знать число, захваченное полем ввода. Он будет проходить по всем листам, пропуская 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 ячеек, выполняя этот ряд за строкой.

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

Удачи!

...