ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:Tegutan 教えて下さい。VBAマクロで困ってます。
困り度:
  • すぐに回答を!
VBAマクロ初心者です。実は、次のようなコードをどのように書けばよいのか教えて下さい。
例えば、
Aは、デスクトップ上のエクセルファイルの"Sheet1"のA1:B4のA列は数値、B列は文字列。
Aをデスクトップ上の別のフォルダーにあるエクセルファイルの"Sheet1"のA1:B4にデータをコピーをするのですが・・・。まったくわかりません。または、説明が下手でやりたい事が伝わらないかもしれませんが、よろしくお願いいたします。
質問投稿日時:08/04/09 23:47
質問番号:3936335
最新から表示回答順に表示

回答

 

回答者:fumufumu_2006 すみません、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
をコピーして実行する。

これでもうまくいかない場合は・・・
すみません、力になれないようです。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/27 18:14
回答番号:No.8
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:pulsa 横からすいません。
セルの変更は許可されていますよね?
セルのロック+シート保護 でセルの変更が禁止されます(Excel2003 他も?)

他の質問で

こうして下さい
できません
じゃあこれは?
できません




あげく
すいません。セルがロックされてました…orz
が、よくあります

ステップ実行はご存知ですか?
fumufumu_2006さんの例で実行するとしたら 
Sub sample1 以下のどこかにカーソルを持って行き、実行 or F5かと思いますが、ここでF8です
標準だと現在実行中の行(厳密には、実行直前)の部分が黄色くなります
つまりもう一度F8を押すと、今黄色い部分が、実行されます

これで、PasteSpecialを行った時どうなるのかがわかります
また、これで、Closeを行った時の動作がわかります

閉じる(Close)と命令して閉じず、エラーも無い事から、エラーがキャンセルされているようですね
subの下に
On Error GoTo 0
を入れてみてください
エラーのキャンセルをキャンセル(?)
(エラーが出るように戻す命令です)

なお、fumufumu_2006さんが一番最初に示されたコードで、私の環境では問題なく実行されましたので、コーディングの問題では無い事を書いておきます
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:08/04/27 14:26
回答番号:No.7
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:fumufumu_2006 たびたびごめんなさい。
ANo.5ので書いている手動での(1)(2)の結果を教えてください。
種類:補足要求
どんな人:一般人
自信:参考意見
回答日時:08/04/15 02:56
回答番号:No.6
この回答への補足たびたびすみません。ところで、No.5で書かれてある手動(1),
(2)は、特に問題なく動作しますが・・・。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:fumufumu_2006 うーん、どうしてでしょうか?
まず、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のバージョンを教えてください。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/13 19:07
回答番号:No.5
この回答への補足ご丁寧にありがとうございます。まず結果ですが。
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 以下を試してみてください。

手動で、
デスクトップ上の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
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/12 05:30
回答番号:No.4
この回答への補足本当に申し訳ないんですけど,Sample1〜3では、どれもA.xlsは開いた状態で、c.xlsには一瞬A.xlsのの値が一瞬表示されますが、すぐに値が消え(値は保存されません)、c.xlsは開いた状態で終わります。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:fumufumu_2006 >デスクトップの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
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/11 07:06
回答番号:No.3
この回答への補足たびたびすみません。ご説明が下手で申し訳なく思います。まずデスクトップ上にA(エクセルファイル)と同じくデスクトップ上にB(フォルダ)をおいて、Bの中にC(エクセルファイル)があります。Cに教えていただいたコードをマクロで書きました。実行すると、CのエクセルのセルにいったんAの値が表示されますが、すぐに消えてしまいます。そして、AもCがデスクトップ上で開いた状態のままになって
しまいます。またとくに警告はでません。ご丁寧な返事ありがとうございます。再度よろしくお願いいたします。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:fumufumu_2006 こんなのはどうでしょうか?
デスクトップの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
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/10 03:22
回答番号:No.2
この回答への補足早朝にも関わらずお返事ありがとうございます。早速試してみたのですが、デスクトップのA.xlsが閉じず、またデスクトップのBフォルダ内のC.xlsのSheet1にデータが保存されないで、消えてしまうのですが・・・・。原因がわかりません。お忙しいとは思いますが、もう1度お願いできますでしょうか。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:bin-chan EXCELバージョンが不明ですが。

メニューのツール>マクロと進んで、マクロの記録をクリック。
なさりたい処理をそのまま実行します。
処理が終わったら、マクロの記録の終了「■」をクリックして停止。

これで、(冗長な記述ですが)VBAのコードが記録されます。

メニューのツール>マクロ>マクロと進んで、編集で中身を確認してみてください。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/09 23:59
回答番号:No.1
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)
最新から表示回答順に表示