- 締切済み
教えて下さい。VBAマクロで困ってます。
VBAマクロ初心者です。実は、次のようなコードをどのように書けばよいのか教えて下さい。 例えば、 Aは、デスクトップ上のエクセルファイルの"Sheet1"のA1:B4のA列は数値、B列は文字列。 Aをデスクトップ上の別のフォルダーにあるエクセルファイルの"Sheet1"のA1:B4にデータをコピーをするのですが・・・。まったくわかりません。または、説明が下手でやりたい事が伝わらないかもしれませんが、よろしくお願いいたします。
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- fumufumu_2006
- ベストアンサー率66% (163/245)
すみません、ANo.6に補足ついていたんですね。 ANo.5についてです。 Samle4について >A.xlsの画面が表示され、Msgbox"A.xlsを開き閉じます。"が出ます。OkボタンをClick→C.xlsの画面が出ますが、値は表示されません。A.xlsは閉じます。 なぜA.xlsしか操作していないにも関わらず、C.xlsが表示されるのか? Samle6について >A.xlsの画面が表示され、Msgbox"B\C.xlsを開き閉じます。"が 出ます。OkボタンをClick→C.xlsの画面が出ますが、値は表示されません。A.xlsは開いた状態です。 なぜ、A.xlsが閉じないのか? そこで、A.xlsやC.xlsに何か設定があるか、ANo.6で手動で試してもらったのですが、同じファイルに対して手動の動作ができるのに、VBAからではできないのがわからない原因です。 このVBAがA.xlsやC.xls自身にある場合は、開く時にエラーが発生する(同名では開けない)はずなので、A.xlsが開く理由も不明です。 手動で行った場合は、何か不具合がある可能性を試してもらったのですが、この状況ではA.xlsやC.xlsに問題はないようです。 そこで、最後にお願いします。 まったく何も無い状態で試してください。 新規作成でデスクトップ上に新しいA.xlsを作り、Sheet1のA1:B4範囲に適当なデータを入れて保存して閉じる。 新規作成でデスクトップ上のBフォルダにC.xlsを作り保存して閉じる。 新規作成でブックを作り、その標準モジュールにANo.2で書いた Sub Sample() Dim srcBook As Workbook Dim dstBook As Workbook Dim desktopPath As String desktopPath = CreateObject("WScript.Shell").SpecialFolders("desktop") 'デスクトップのパス Set srcBook = Workbooks.Open(desktopPath & "\A.xls") 'コピー元ブック(デスクトップのA.xls) Set dstBook = Workbooks.Open(desktopPath & "\B\C.xls") 'コピー先ブック(デスクトップのBフォルダ内のC.xls) srcBook.Sheets("Sheet1").Range("A1:B4").Copy Destination:=dstBook.Sheets("Sheet1").Range("A1:B4") 'データコピー srcBook.Close '閉じる dstBook.Close savechanges:=True 'コピー先ブックは、変更を保存して閉じる End Sub をコピーして実行する。 これでもうまくいかない場合は・・・ すみません、力になれないようです。
- pulsa
- ベストアンサー率57% (34/59)
横からすいません。 セルの変更は許可されていますよね? セルのロック+シート保護 でセルの変更が禁止されます(Excel2003 他も?) 他の質問で こうして下さい できません じゃあこれは? できません ・ ・ ・ あげく すいません。セルがロックされてました…orz が、よくあります ステップ実行はご存知ですか? fumufumu_2006さんの例で実行するとしたら Sub sample1 以下のどこかにカーソルを持って行き、実行 or F5かと思いますが、ここでF8です 標準だと現在実行中の行(厳密には、実行直前)の部分が黄色くなります つまりもう一度F8を押すと、今黄色い部分が、実行されます これで、PasteSpecialを行った時どうなるのかがわかります また、これで、Closeを行った時の動作がわかります 閉じる(Close)と命令して閉じず、エラーも無い事から、エラーがキャンセルされているようですね subの下に On Error GoTo 0 を入れてみてください エラーのキャンセルをキャンセル(?) (エラーが出るように戻す命令です) なお、fumufumu_2006さんが一番最初に示されたコードで、私の環境では問題なく実行されましたので、コーディングの問題では無い事を書いておきます
- fumufumu_2006
- ベストアンサー率66% (163/245)
たびたびごめんなさい。 ANo.5ので書いている手動での(1)(2)の結果を教えてください。
- fumufumu_2006
- ベストアンサー率66% (163/245)
うーん、どうしてでしょうか? まず、ANo.4で書いていますが(1)と(2)の動作の結果を教えてください。 (1) 手動で、 デスクトップ上のA.xlsを開く。 デスクトップ上のBフォルダ内のC.xlsを開く。 A.xlsのSheet1のA1:B4範囲をコピーする。 C.xlsのSheet1のA1を選んで、[編集][形式を指定して貼り付け]の[値]をする。 A.xlsを閉じる。 C.xlsを閉じる。この時「変更を保存しますか?」と聞かれるので「はい」を選ぶ。 この時、エラー、警告、その他のメッセージや結果が、問題のA.xlsとC.xlsに対して行った場合と何か違う所はありませんか? プログラムはこれ(とほぼ同等な事)をしています。 (2) 手動で、 新規でブックを作り、Sheet1のA1:B4範囲に適当な値を入れて、デスクトップ上にA.xlsの名前で保存して閉じる。 新規でブックを作り、何もせずにデスクトップ上のBフォルダ内にC.xlsの名前で保存して閉じる。 これに対してプログラムを実行する。 この時、エラー、警告、その他のメッセージや結果が、問題のA.xlsとC.xlsに対して行った場合と何か違う所はありませんか? これは私がサンプルデータを作って試した時の状況です。 次に、sample1からsample3の結果についてです。 >Sample1~3では、どれもA.xlsは開いた状態で、c.xlsには一瞬A.xlsのの値が一瞬表示されますが、すぐに値が消え(値は保存されません)、c.xlsは開いた状態で終わります。 Sample1~3はC.xlsを変更していませんので、各サンプルでないものが実行されているようです。 もう一度Sample1~3を試して、結果を教えてください。 また、以下の各サンプルも加え、Sample1~3とSample4~6の結果を全て教えてください。 Sub Sample4() MsgBox "sample4 A.xlsを開き閉じます" Dim srcBook As Workbook Dim desktopPath As String desktopPath = CreateObject("WScript.Shell").SpecialFolders("desktop") Set srcBook = Workbooks.Open(desktopPath & "\A.xls") srcBook.Close End Sub Sub Sample5() MsgBox "sample5 B\C.xlsを開き閉じます" Dim dstBook As Workbook Dim desktopPath As String desktopPath = CreateObject("WScript.Shell").SpecialFolders("desktop") Set dstBook = Workbooks.Open(desktopPath & "\B\C.xls") dstBook.Close savechanges:=True End Sub Sub Sample6() MsgBox "sample6 A.xlsとB\C.xlsを開き閉じます" Dim srcBook As Workbook Dim dstBook As Workbook Dim desktopPath As String desktopPath = CreateObject("WScript.Shell").SpecialFolders("desktop") Set srcBook = Workbooks.Open(desktopPath & "\A.xls") Set dstBook = Workbooks.Open(desktopPath & "\B\C.xls") srcBook.Close dstBook.Close End Sub それと、OSとExcelのバージョンを教えてください。
補足
ご丁寧にありがとうございます。まず結果ですが。 SAmple1について C.xlsの画面上に一瞬、A.xlsの値は表示されますが、すぐに消えま す。なお、Msgboxは表示されません。またA.xlsは開いた状態のま まです。 Samle2について A.xlsの画面が表示され、Msgbox"A.xlsを開いています。"が出ま す。OkボタンをClick→C.xlsの画面が出ますが、値は表示されませ ん。A.xlsは閉じます。 Samle3について A.xlsの画面が表示され、Msgbox"A.xlsを開いています。"が出ま す。OkボタンをClick→C.xlsの画面が出ますが、値は表示されませ ん。A.xlsは開いた状態です。 Samle4について A.xlsの画面が表示され、Msgbox"A.xlsを開き閉じます。"が出ま す。OkボタンをClick→C.xlsの画面が出ますが、値は表示されませ ん。A.xlsは閉じます。 Samle5について A.xlsの画面が表示され、Msgbox"B\C.xlsを開き閉じます。"が 出 ます。OkボタンをClick→C.xlsの画面が出ますが、値は表示されま せん。A.xlsは閉じます。 Samle6について A.xlsの画面が表示され、Msgbox"B\C.xlsを開き閉じます。"が 出 ます。OkボタンをClick→C.xlsの画面が出ますが、値は表示されま せん。A.xlsは開いた状態です。 以上が試してみた結果です。なお、OSはWindowsXP Home Edition 2002 SP2、Exce2003です。
- fumufumu_2006
- ベストアンサー率66% (163/245)
以下を試してみてください。 手動で、 デスクトップ上のA.xlsを開く。 デスクトップ上のBフォルダ内のC.xlsを開く。 A.xlsのSheet1のA1:B4範囲をコピーする。 C.xlsのSheet1のA1を選んで、[編集][形式を指定して貼り付け]の[値]をする。 A.xlsを閉じる。 C.xlsを閉じる。この時「変更を保存しますか?」と聞かれるので「はい」を選ぶ。 この時、エラー、警告、その他のメッセージや結果が、問題のA.xlsとC.xlsに対して行った場合と何か違う所はありませんか? プログラムはこれ(とほぼ同等な事)をしています。 また、 新規でブックを作り、Sheet1のA1:B4範囲に適当な値を入れて、デスクトップ上にA.xlsの名前で保存して閉じる。 新規でブックを作り、何もせずにデスクトップ上のBフォルダ内にC.xlsの名前で保存して閉じる。 これに対してプログラムを実行する。 この時、エラー、警告、その他のメッセージや結果が、問題のA.xlsとC.xlsに対して行った場合と何か違う所はありませんか? これは私がサンプルデータを作って試した時の状況です。 以下のサンプルでは、最後にA.xlsやC.xlsは閉じますか? また、msgboxのメッセージ以外で、途中で何かメッセージは出ませんか? Sub Sample1() Dim srcBook As Workbook Dim dstBook As Workbook Dim desktopPath As String desktopPath = CreateObject("WScript.Shell").SpecialFolders("desktop") 'デスクトップのパス Set srcBook = Workbooks.Open(desktopPath & "\A.xls") 'コピー元ブック(デスクトップのA.xls) Set dstBook = Workbooks.Open(desktopPath & "\B\C.xls") 'コピー先ブック(デスクトップのBフォルダ内のC.xls) MsgBox "これから閉じます" srcBook.Close '閉じる dstBook.Close savechanges:=True 'コピー先ブックは、変更を保存して閉じる End Sub Sub Sample2() Dim srcBook As Workbook Dim desktopPath As String desktopPath = CreateObject("WScript.Shell").SpecialFolders("desktop") 'デスクトップのパス Set srcBook = Workbooks.Open(desktopPath & "\A.xls") 'コピー元ブック(デスクトップのA.xls) MsgBox "A.xlsを開いてます" srcBook.Close '閉じる End Sub Sub Sample3() Dim srcBook As Workbook Dim dstBook As Workbook Dim desktopPath As String desktopPath = CreateObject("WScript.Shell").SpecialFolders("desktop") 'デスクトップのパス Set srcBook = Workbooks.Open(desktopPath & "\A.xls") 'コピー元ブック(デスクトップのA.xls) MsgBox "A.xlsを開いてます" Set dstBook = Workbooks.Open(desktopPath & "\B\C.xls") 'コピー先ブック(デスクトップのBフォルダ内のC.xls) MsgBox "BフォルダのC.xlsを開いてます" dstBook.Close MsgBox "BフォルダのC.xlsを閉じました" srcBook.Close '閉じる MsgBox "A.xlsを閉じました" End Sub
補足
本当に申し訳ないんですけど,Sample1~3では、どれもA.xlsは開いた状態で、c.xlsには一瞬A.xlsのの値が一瞬表示されますが、すぐに値が消え(値は保存されません)、c.xlsは開いた状態で終わります。
- fumufumu_2006
- ベストアンサー率66% (163/245)
>デスクトップのA.xlsが閉じず、 >またデスクトップのBフォルダ内のC.xlsのSheet1にデータが保存されないで、消えてしまうのですが・・・・。 私もわかりません・・・ まず、確認させてください。 このプログラムがD.xls(A.xlsでもC.xlsでもなければ何でもいいんですが)にあるとします。 A.xlsとC.xlsが最初に閉じている状態です。 で、このプログラムを動かすと、デスクトップのA.xlsが開き、でも閉じない。 「データが保存されないで、消えてしまう」の意味は、 デスクトップのBフォルダ内のC.xlsが消えてしまう。 なのか、 C.xlsのSheet1のA1:B4の元のデータが消えるが、A.xlsのデータが書き込まれない。 なのでしょうか? A.xlsの元データが計算結果だとおかしくなるので、C.xlsに値をコピーするサンプルです。 表示形式が崩れる(日付とかが数字になってしまう)場合は、形式もコピーしてください。 A.xlsが閉じない理由はわからないのですが、何か表示はありませんか?(エラーとか警告) Sub Sample2() Dim srcBook As Workbook Dim dstBook As Workbook Dim desktopPath As String desktopPath = CreateObject("WScript.Shell").SpecialFolders("desktop") 'デスクトップのパス Set srcBook = Workbooks.Open(desktopPath & "\A.xls") 'コピー元ブック(デスクトップのA.xls) Set dstBook = Workbooks.Open(desktopPath & "\B\C.xls") 'コピー先ブック(デスクトップのBフォルダ内のC.xls) srcBook.Sheets("Sheet1").Range("A1:B4").Copy 'データコピー dstBook.Sheets("Sheet1").Range("A1:B4").PasteSpecial Paste:=xlValues '値を貼り付け 'dstBook.Sheets("Sheet1").Range("A1:B4").PasteSpecial Paste:=xlPasteFormats '書式を貼り付け srcBook.Close '閉じる dstBook.Close savechanges:=True 'コピー先ブックは、変更を保存して閉じる End Sub
補足
たびたびすみません。ご説明が下手で申し訳なく思います。まずデスクトップ上にA(エクセルファイル)と同じくデスクトップ上にB(フォルダ)をおいて、Bの中にC(エクセルファイル)があります。Cに教えていただいたコードをマクロで書きました。実行すると、CのエクセルのセルにいったんAの値が表示されますが、すぐに消えてしまいます。そして、AもCがデスクトップ上で開いた状態のままになって しまいます。またとくに警告はでません。ご丁寧な返事ありがとうございます。再度よろしくお願いいたします。
- fumufumu_2006
- ベストアンサー率66% (163/245)
こんなのはどうでしょうか? デスクトップのA.xlsのSheet1のA1:B4を、デスクトップのBフォルダ内のC.xlsのSheet1のA1:B4にコピーします。 Sub Sample() Dim srcBook As Workbook Dim dstBook As Workbook Dim desktopPath As String desktopPath = CreateObject("WScript.Shell").SpecialFolders("desktop") 'デスクトップのパス Set srcBook = Workbooks.Open(desktopPath & "\A.xls") 'コピー元ブック(デスクトップのA.xls) Set dstBook = Workbooks.Open(desktopPath & "\B\C.xls") 'コピー先ブック(デスクトップのBフォルダ内のC.xls) srcBook.Sheets("Sheet1").Range("A1:B4").Copy Destination:=dstBook.Sheets("Sheet1").Range("A1:B4") 'データコピー srcBook.Close '閉じる dstBook.Close savechanges:=True 'コピー先ブックは、変更を保存して閉じる End Sub
補足
早朝にも関わらずお返事ありがとうございます。早速試してみたのですが、デスクトップのA.xlsが閉じず、またデスクトップのBフォルダ内のC.xlsのSheet1にデータが保存されないで、消えてしまうのですが・・・・。原因がわかりません。お忙しいとは思いますが、もう1度お願いできますでしょうか。
- bin-chan
- ベストアンサー率33% (1403/4213)
EXCELバージョンが不明ですが。 メニューのツール>マクロと進んで、マクロの記録をクリック。 なさりたい処理をそのまま実行します。 処理が終わったら、マクロの記録の終了「■」をクリックして停止。 これで、(冗長な記述ですが)VBAのコードが記録されます。 メニューのツール>マクロ>マクロと進んで、編集で中身を確認してみてください。
補足
たびたびすみません。ところで、No.5で書かれてある手動(1), (2)は、特に問題なく動作しますが・・・。