2017-11-04 22 views
0

現在のブックの一部の列を追加するマクロを作成しようとしています。私はVbaを秀でるために新しいのですが、私はここで質問する前にインターネットで回答を見つけようとしました。事前のおかげで現在のブックにマクロがある場合、別のブックを使用します。

マイコード:私はいくつかのソリューションを試みたが、それはこの達するまで、私のコードだけで実行

Sub Mono_recurso() 
' 
' Mono_recurso Macro 
' 
lin_ori = 2 
lin_dest = 2 


Dim wkb As Excel.Workbook 
Dim wks As Excel.Worksheet 

Set wkb = Excel.Workbooks("C:\Users\Feels Bad Man\Desktop\exemplo.xlsm") 
Set wks = wkb.Worksheets("Tabela de síntese") 


Do While Sheets("Mono").Cells(lin_ori, 1) <> "" 


Sheets("Mono recurso").Cells(lin_dest, 1) = Sheets("Mono").Cells(lin_ori, 1) 
Sheets("Mono recurso").Cells(lin_dest, 2) = Sheets("Mono").Cells(lin_ori, 2) 

lin_ori = lin_ori + 1 
lin_dest = lin_dest + 1 

Loop 



lin_ori = 3 
lin_dest = 2 


Do While Sheets("Mono recurso").Cells(lin_dest, 1) <> "" 

Do While wkb.wks.Cells(lin_ori, 2) ' <> "")) 


If Sheets("Mono recurso").Cells(lin_dest, 1) = wkb.wks.Cells(lin_ori, 2) Then 


    Sheets("Mono recurso").Cells(lin_dest, 3) = wkb.wks.Cells(lin_ori, 6) 
    Sheets("Mono recurso").Cells(lin_dest, 4) = wkb.wks.Cells(lin_ori, 7) 
    Sheets("Mono recurso").Cells(lin_dest, 5) = wkb.wks.Cells(lin_ori, 8) 
    Sheets("Mono recurso").Cells(lin_dest, 6) = wkb.wks.Cells(lin_ori, 15) 
    Sheets("Mono recurso").Cells(lin_dest, 7) = wkb.wks.Cells(lin_ori, 16) 

    lin_ori = lin_ori + 1 

Else 

    lin_ori = lin_ori + 1 

End If 

Loop 

lin_dest = lin_dest + 1 



Loop 

' 
End Sub 

Set wkb = Excel.Workbooks("C:\Users\Feels Bad Man\Desktop\exemplo.xlsm") 
+0

この行は、 'Set wkb = Excel.Workbooks(" exampleso.xlsm ")'と言うべきです。 Excelは2つのブックを同じファイル名で開くことを許可しないため、あなたが参照しているブックが 'C:\ Users \ Feels Bad Man \ Desktop'から開いたブックであることがわかります。 – YowE3K

+0

申し訳ありませんが、私はそれを試みましたが、それは同じ行で停止します...両方のブックを使用することは可能ですか?私は、私が働いているものとサイクルを実行するためにロードしたいものを意味しています。だから私は1つにExcelファイルの両方をマージする必要はありません –

+1

質問には常にエラー番号と正確なメッセージを提供してください。 – Excelosaurus

答えて

1

私の仮定は、あなたがから他のワークブックを開くようにしたいということですあなたのコード、いくつかの値をあなたのマクロを含むブックに転送し、おそらく他のブックを閉じます。

コードにいくつか問題がありましたが、これについては以下で取り上げようとしています。コメントはいくつかの詳細を提供します。

'Always put Option Explicit at the top of your modules. 
'Declare all variables and compile your code (menu: Debug/Compile). 
Option Explicit 

' 
' Mono_recurso Macro 
' 
Sub Mono_recurso() 
    Dim exemploWbk As Excel.Workbook 
    Dim tabelaSinteseWks As Excel.Worksheet 
    Dim monoWks As Excel.Worksheet 
    Dim monoRecursoWks As Excel.Worksheet 
    Dim lin_ori As Long 
    Dim lin_dest As Long 

    'Open the workbook. 
    'Note: there are many options to the Open method; check them online. 
    Set exemploWbk = Workbooks.Open("C:\Users\Feels Bad Man\Desktop\exemplo.xlsm") 

    'Obtain a reference to the target worksheet. 
    Set tabelaSinteseWks = exemploWbk.Worksheets("Tabela de síntese") 

    'Obtain references to local worksheets. 
    'Notice the use of ThisWorkbook; without it, Excel would try to find worksheet "Mono" in the Active workbook, 
    'which might not be the one you'd expect. 
    Set monoWks = ThisWorkbook.Worksheets("Mono") 
    Set monoRecursoWks = ThisWorkbook.Worksheets("Mono recurso") 

    'Haven't tried to understand what you want to do, but notice the use of the references obtained above, 
    'the Value2 property for good practice (without it, you're dealing with Range objects and relying on 
    'VBA to use the default property of the Range class), and the correction from your original "wkb.wks" 
    'to just "...Wks". 

    lin_ori = 2 
    lin_dest = 2 
    Do While monoWks.Cells(lin_ori, 1).Value2 <> "" 
     monoRecursoWks.Cells(lin_dest, 1).Value2 = monoWks.Cells(lin_ori, 1).Value2 
     monoRecursoWks.Cells(lin_dest, 2).Value2 = monoWks.Cells(lin_ori, 2).Value2 

     lin_ori = lin_ori + 1 
     lin_dest = lin_dest + 1 
    Loop 

    lin_ori = 3 
    lin_dest = 2 
    Do While monoRecursoWks.Cells(lin_dest, 1).Value2 <> "" 
     Do While tabelaSinteseWks.Cells(lin_ori, 2).Value2 <> "" 'Note: you had commented out this comparison. 
      If monoRecursoWks.Cells(lin_dest, 1) = tabelaSinteseWks.Cells(lin_ori, 2) Then 
       monoRecursoWks.Cells(lin_dest, 3) = tabelaSinteseWks.Cells(lin_ori, 6) 
       monoRecursoWks.Cells(lin_dest, 4) = tabelaSinteseWks.Cells(lin_ori, 7) 
       monoRecursoWks.Cells(lin_dest, 5) = tabelaSinteseWks.Cells(lin_ori, 8) 
       monoRecursoWks.Cells(lin_dest, 6) = tabelaSinteseWks.Cells(lin_ori, 15) 
       monoRecursoWks.Cells(lin_dest, 7) = tabelaSinteseWks.Cells(lin_ori, 16) 
      End If 

      lin_ori = lin_ori + 1 
     Loop 

     lin_dest = lin_dest + 1 
    Loop 

    'Release references to objects within the other workbook before closing it. 
    Set tabelaSinteseWks = Nothing 
    exemploWbk.Close SaveChanges:=False 

    'Cleanup. 
    Set monoRecursoWks = Nothing 
    Set monoWks = Nothing 
    Set exemploWbk = Nothing 
End Sub 

あなたがマクロを含むワークブックのワークシートで行うことができますクールなものがあります:VBAで直接そのコードネームを使用しています。ワークシートのCodeNameは、Visual Basic Editorから表示および変更できます。クールな部分は、Excelからワークシートの名前を変更してもこの名前が変わらないということです。

プロジェクトエクスプローラ(Ctrl + R)でMicrosoft Excel Objectsノードのワークシート(たとえば、Mono)を選択し、F4キーを押してプロパティウィンドウに移動します。 (Name)プロパティを変更します。今のところそれはおそらくSheet1か何かです。それをmonoWksに変更してください。 Mono recursoワークシートの場合も同様で、名前はmonoRecursoWksです。

これを実行すると、2つのローカルワークシートをCodeNameで直接参照することができるため、いくつかのコード行を取り除くことができます。ボーナスは、Excelから見たように、名前が変更された場合、コードの破損を心配する必要がないということです。

Sub Mono_recurso() 
    Dim exemploWbk As Excel.Workbook 
    Dim tabelaSinteseWks As Excel.Worksheet 
    '... No need to declare variables to hold local worksheet references ... 
    Dim lin_ori As Long 
    Dim lin_dest As Long 

    'Open the workbook. 
    'Note: there are many options to the Open method; check them online. 
    Set exemploWbk = Workbooks.Open("C:\Users\Feels Bad Man\Desktop\exemplo.xlsm") 

    '... No need to get references to local worksheets by their tab names in Excel ... 

    'Obtain a reference to the target worksheet. 
    Set tabelaSinteseWks = exemploWbk.Worksheets("Tabela de síntese") 

    '... Copy code goes here, unchanged ... 

    'Release references to objects within the other workbook before closing it. 
    Set tabelaSinteseWks = Nothing 
    exemploWbk.Close SaveChanges:=False 

    'Cleanup. 
    Set exemploWbk = Nothing 
End Sub 
+0

うわー今は動いているけど、やりたいことをしていない...セルに文字列がある場合、 "value2"を使ったの? 私がしようとしているのは、スプレッドシート(​​Tabela deSíntese)のExample.xmlxのスプレッドシート(​​Mono)にある同じ文字列があるかどうかを調べることです。そのシートを元のシートに貼り付けます。私はそれが25MbでExcelファイルを持っていないので、私はそれがこのように動作します。 このソリューションとこのコードを思いついたことをうれしく思います。私が知っているexcel-vbaについては、先月私が学んだので、まだ適切にコードすることがわからない –

+0

はい、Value2はセルに保存されているものと一緒に動作します。 – Excelosaurus

+0

ありがとう、それはうまくいきます。私はこのコード例で多くを学んだ:) –

関連する問題