2017-05-15 14 views
0

何千もの古いファイルから新しくフォーマットされたファイルに情報を転送するのに役立つマクロを書き込もうとします。ほとんどが標準ですので、 "古い"本の指定範囲から "新しい"本の指定範囲に値を移すことができるマクロがあります(このサイトのおかげで比較的痛みがありません)。入力ボックスプロンプト(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

の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 

ユーザーが選択するすべての範囲でこの方法を実行する必要があります。ユーザーが非常に多くの範囲を選択しなければならず、間違いが発生する可能性があるため、このアプローチはエラーが発生しやすいと感じています。しかし、これが唯一のオプションであれば、これを実装する方法です。

+0

ありがとうございました。私は壁の試みから一種の文字列としてそれらのdim'dを持っていた、ここに投稿するときにそれを変更することを忘れました。私は値を割り当てるだけで動作させることができました。それは、ユーザーの入力が多いためエラーが発生しやすいので、私はそれをカバーするためにいくつかの時間を費やす必要がある、私は値の転送がうれしい!私はVBAの初心者です。助けてくれてありがとう。 – Nmatz

関連する問題