こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

マクロ初心者です。よろしくお願いします。

<質問>
コマンドボタンをクリックしたら、任意のエクセルファイルを指定して開き、その開いたファイル(白紙状態のファイル)にマクロを実行させる方法を探してます。

<作成マクロ>
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に貼り付ける

このマクロを実行させるにはどこを改善すれば良いでしょうか?
ご助言いただけると助かります。
よろしくお願い致します。

投稿日時 - 2009-08-21 12:57:32

QNo.5224943

すぐに回答ほしいです

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

間違いがいくつかあります。

>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

とも書けます。
以上です。

投稿日時 - 2009-08-21 13:55:21

お礼

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

投稿日時 - 2009-08-21 15:15:25

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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ペース」を実行できます。

投稿日時 - 2009-08-21 14:23:40

お礼

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

投稿日時 - 2009-08-21 15:23:25

ANo.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

投稿日時 - 2009-08-21 13:50:42

お礼

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

投稿日時 - 2009-08-21 16:59:48

ANo.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


で、いかがでしょう。

投稿日時 - 2009-08-21 13:23:34

お礼

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

投稿日時 - 2009-08-21 15:13:21

あなたにオススメの質問