Получите диапазон от приглашения ввода (wb1), передайте значения в определенный диапазон (wb2)

Попытка написать макрос, который может помочь передавать информацию из тысяч старых файлов в файлы, отформатированные в новом формате. Большинство из них являются стандартными, поэтому у меня есть макрос, который может передавать значения из указанных диапазонов в «старых» книгах в указанные диапазоны в «новых» книгах, относительно безболезненно (благодаря этому сайту).

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

Я пробовал присваивать значения как =, и я пробовал копировать, пока не работает. Любые подсказки будут высоко оценены.

Вот код до сих пор (это всего лишь одна итерация, как я уже сказал, я пробовал кучу разных вещей):

sub magic_select() Dim wb As Workbook, wb2 As Workbook Dim vfile As Variant Dim name As String Dim oldname As String Dim Cvalves, Ovalves, breakers, safety_inst, procedure_ID, Pvalves, Pbreakers, electest As String 'set source workbook Set wb = ActiveWorkbook 'open target workbook vfile = Application.GetOpenFilename("Excel-Files,*.xls*", _ 1, "Select One File to Open", , False) 'if nothing selected, exit sub If TypeName(vfile) = "Boolean" Then Exit Sub 'open selected file Workbooks.Open vfile 'set target workbook Set wb2 = ActiveWorkbook 'procedure_ID = Application.InputBox(Prompt:="select procedure ID: one cell", Type:=8) Cvalves = Application.InputBox(Prompt:="select valves to be locked closed", Type:=8) Ovalves = Application.InputBox(Prompt:="select valves to be locked open", Type:=8) breakers = Application.InputBox(Prompt:="select breakers to be opened and locked out", Type:=8) safety_inst = Application.InputBox(Prompt:="select Special Safety Instructions", Type:=8) Pvalves = Application.InputBox(Prompt:="select valves from Procedure(page 2)", Type:=8) Pbreakers = Application.InputBox(Prompt:="select breakers from Procedure (page2)", Type:=8) electest = Application.InputBox(Prompt:="select Electrical Test Procedure", Type:=8) 'copies all the appropriate values to blank form 'wb is blank form (copy to) 'wb2 is old LOTO form (copied from) 'edit values as needed wb.Worksheets(1).Range("e11, e85").Value = wb2.Worksheets(1).Range("e11").Value wb.Worksheets(1).Range("E21:I45").Value = Range("Cvalves").Value wb.Worksheets(1).Range("E50:I61").Value = Range("Ovalves").Value wb.Worksheets(1).Range("E95:G121").Value = Range("breakers").Value wb.Worksheets(1).Range("a124:a128").Value = Range("breakers").Val wb.Worksheets(1).Range("h70, c132").Value = Range("procedure_ID").Value wb.Worksheets(2).Range("a10:f54").Value = Range("Pvalves").Value wb.Worksheets(2).Range("a60:f89").Value = Range("Pbreakers").Value wb.Worksheets(2).Range("a92:a97").Value = Range("Electest").Value name = wb2.name oldname = "_done_" & name 'resaves old file under new name wb2.SaveAs Filename:="xyz" & oldname, _ FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False 'closes old file wb2.Close 'deletes old duplicate file Kill vfile 'Set wb = ActiveWorkbook 'saves as new, separate LOTO form wb.SaveAs Filename:="zyx" & name, _ FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False 're-open blank macro form Workbooks.Open ("C:\Users\me.etc") 'closes new file wb.Close End Sub 

1- Возвращаемое значение Application.InputBox(..., Type:=8) является Range object . Поэтому, прежде всего, сгладьте переменные соответствующим образом.

 Dim Cvalves As Range, Ovalves As Range, breakers As Range, ' etc.. 

2- Set диапазон в выбранный диапазон пользователя:

  Set Cvalves = Application.InputBox(Prompt:="select valves to be locked closed", Type:=8) ' ^^^ 

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

 CValves.Copy wb.Worksheets(1).Range("E21") 

Или вы можете (предпочтительно) сделать это без копирования, непосредственно присваивая значения:

 wb.Worksheets(1).Range("E21").Resize(CValves.Rows.Count, CValves.Columns.Count).Value = CValves.Value2 

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

Давайте будем гением компьютера.