• ベストアンサー

【マクロ】指定したファイルを開いてマクロを実行

マクロ初心者です。よろしくお願いします。 <質問> コマンドボタンをクリックしたら、任意のエクセルファイルを指定して開き、その開いたファイル(白紙状態のファイル)にマクロを実行させる方法を探してます。 <作成マクロ> Private Sub CommandButton1_Click() Dim OpenFileName As String OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls") If OpenFileName <> "False" Then Workbooks.Open OpenFileName End If Workbooks(Dir(OpenFileName)).Activate ActiveCell.FormulaR1C1 = "テスト" Range("A1").Select Selection.Copy Range("B1").Select ActiveSheet.Paste End Sub <マクロ説明> --コマンドボタンをクリックして指定したエクセルファイルを開く-- Private Sub CommandButton1_Click() Dim OpenFileName As String OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls") If OpenFileName <> "False" Then Workbooks.Open OpenFileName End If Workbooks(Dir(OpenFileName)).Activate --開いたエクセルファイル(白紙状態)のセルA1に「テスト」を入力した後、コピーしセルB2に貼り付ける--   ActiveCell.FormulaR1C1 = "テスト" Range("A1").Select Selection.Copy Range("B1").Select ActiveSheet.Paste End Sub コマンドボタンをクリック ↓ 任意のエクセルファイルを指定して開く ↓ 開いたファイル(白紙状態のファイル)のセルA1に「テスト」と書き込み セルA1の「テスト」をコピーしセルB1に貼り付ける このマクロを実行させるにはどこを改善すれば良いでしょうか? ご助言いただけると助かります。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.3

間違いがいくつかあります。 >If OpenFileName <> "False" Then >Workbooks.Open OpenFileName >End If これではFalseの時も処理が続いていましますので If OpenFileName = "False" Then Exit Sub Workbooks.Open OpenFileName として、Cancelのときは終了するようにしましょう。 また  >Workbooks(Dir(OpenFileName)).Activate これは不要です。 Workbooks.Openの時点でActiveになります。 あと、 >ActiveCell.FormulaR1C1 = "テスト" >Range("A1").Select >Selection.Copy >Range("B1").Select これらのRangeオブジェクトがどのシートか明示しましょう。   それらを踏まえて。。。 '---------------------------------------------- Private Sub CommandButton1_Click()  Dim OpenFileName As String  OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls")    If OpenFileName = "False" Then    MsgBox "終了します"    Exit Sub  End If  Workbooks.Open OpenFileName  ActiveSheet.Range("A1").Value = "テスト"  ActiveSheet.Range("A1").Copy ActiveSheet.Range("B1")  End Sub '----------------------------------- それから、今回は値だけのコピーでしょうから  ActiveSheet.Range("A1").Copy ActiveSheet.Range("B1")  これは  ActiveSheet.Range("B1").Value = ActiveSheet.Range("A1").Value とも書けます。 以上です。

hiro7th
質問者

お礼

回答ありがとうございました。無事、やりたいことができました。 また、キャンセル時にウィンドを閉じるのは便利でした。参考にさせていただきました。

その他の回答 (3)

回答No.4

他の方の回答とだいぶダブりますが、ご容赦を。 ●値の書き込みについて >ActiveCell.FormulaR1C1 = "テスト" これでは、ActiveCellがA1でない場合もあるので、違うセルに「テスト」と書き込まれる場合があります。 Range("A1").Value = "テスト" としてください。 Range("A1").Valueは、「ActiveWorkbook.ActiveSheet.Range("A1").Value」の省略形です。 この省略形は便利なのですが、どのブックのどのシートがアクティブになっているかをちゃんと意識しておかないと、自分の意図と別なシートやセルに書き込んでしまうので注意してください。最初は、 Workbooks("任意のブック名").Worksheets("任意のシート").Range("任意のセル範囲").Value = "任意の値" というように、ブック名とシート名を明示した方がいいでしょう。 この方法は、ブックやシートをわざわざアクティブにしなくても目的のセルに書き込むことが出来るという利点があります。 ●コピーについて >Range("A1").Select >Selection.Copy これもActiveSheetが省略されています。 おそらく人の操作を記録したマクロなので2行になっているようですが、 Range("A1").Copy と1行にすることができます。 さらに、貼り付け先も指定できるので Range("A1").Copy Range("B1") として「A1コピー、B1ペース」を実行できます。

hiro7th
質問者

お礼

回答ありがとうございました。目的のセルの設定が不明だったので 解消されました。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

下記でも大丈夫だと思います。 Private Sub CommandButton1_Click() Dim OpenFileName As String OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls") If OpenFileName <> "False" Then Workbooks.Open OpenFileName End If Range("A1:B1").Value = "テスト" End Sub ブック名とシート名を記述すれば安心です。 シート名に手掛かりはありますか? Private Sub CommandButton1_Click() Dim OpenFileName As String OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls") If OpenFileName <> "False" Then Workbooks.Open OpenFileName End If With Workbooks(Dir(OpenFileName)) .Sheets("シートA").Range("A1:B1").Value = "テスト" End With End Sub

hiro7th
質問者

お礼

目的のシートの場所をきちんと与えてあげることで解消されました。 ありがとうございました。

  • kigoshi
  • ベストアンサー率46% (120/260)
回答No.1

Private Sub CommandButton1_Click() Dim OpenFileName As String OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls") If OpenFileName <> "False" Then Workbooks.Open OpenFileName End If Workbooks(Dir(OpenFileName)).Activate ActiveSheet.Range("A1").Value = "テスト" ActiveSheet.Range("A1").Copy ActiveSheet.Range("B1").Select ActiveSheet.Paste End Sub で、いかがでしょう。

hiro7th
質問者

お礼

ありがとうございました。参考にさせていただきました。 まだまだ勉強することがたくさんあるなと痛感しました。

関連するQ&A