プロが教える店舗&オフィスのセキュリティ対策術

どなたかご教授いただければ幸いです。

エクセルファイルAの4行目の値全てを、デスクトップ上 エクセルファイルBの最終行に
値貼りつけしたいのですが、うまく動作しません。
一旦、下記コードのようにエクセルファイル4行目の値を値貼りつけしてから実行するとうまくいきました。
ただ、転記したいファイルAの4行目には関数を入れているため、できれば関数はそのまま残したいのでエラー保護含め改善策をお教えいただければ幸いです。

※補足
 ファイルBにはデータを集めていきますので、最終行を取得して保存しております。
Sub 管理_保存()
Set WSH = Create Object("Wscript .Shell")
''Dim Desktop Path As String
Desktop Path = WSH .SpecialFolders("Desktop")
Application .Screen Updating = False ''画面停止
str Msg = "個人管理表に追加しますか?"
int Ret = Msg Box(str Msg, vb Yes No, "Msg Box")
If int Ret = vb No Then Exit Sub
Sheets("ファイルA").Select
Range("A4:T4").Select
Application .Cut Copy Mode = False
Selection .Copy
Selection .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone , SkipBlanks _
:=False, Transpose:=False
Rows("4:4").Select
Selection .Copy
Range("A1").Select
Workbooks .Open Filename:= Desktop Path & "\管理\ファイルB.xlsx"

n = Cells(Rows .Count, "A").End(xlUp).Row + 1
Range("A" & n).Select

ActiveSheet .Paste
Cells .Select
Application .CutCopyMode = False
Selection .Copy
Selection .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone , SkipBlanks _
:=False, Transpose:=False
ActiveWorkbook .Save
ActiveWindow .Close

Application . ScreenUpdating = True ''画面再開

Set WSH = Nothing

End Sub

A 回答 (1件)

こんにちは、


エディターの問題でしょうか?変数内やプロパティなどの前にある半角スペースが気になります。。コンパイルできていますか?投稿用に書き直したのでしょうか、あと、型はともかくとして、変数は宣言しましょう。

ご質問のコードをコピペで回答します。

>一旦、下記コードのようにエクセルファイル4行目の値を値貼りつけしてから実行するとうまくいきました。
なるほど、それで同じ場所に.PasteSpecial Paste:=xlPasteValues しているのですね。 
取り敢えず、
>ファイルAの4行目には関数を入れているため、できれば関数はそのまま残した であるなら、不要なので削除

Workbooks .Open Filename:= Desktop Path & "\管理\ファイルB.xlsx"
ここは、取り敢えず開かれると仮定して
目的のシートが表示されている保証はありますか?例えばファイルB.xlsxはシートが1つしかないのであれば良いのですが、、、どうでしょう?
(自分使用のツール、プログラムなら良いけれど、目的シートを表示させるくらいは必要かと)

ここを値貼り付けにすればよいのです。
多分、自動記録を改造したものなのでしょうが、普通のコピペになっていますね。

Rows("4:4").Select
Selection .Copy
Range("A1").Select
Workbooks .Open Filename:= Desktop Path & "\管理\ファイルB.xlsx"

n = Cells(Rows .Count, "A").End(xlUp).Row + 1
Range("A" & n).Select

ActiveSheet .Paste
Cells .Select
Application .CutCopyMode = False

なさりたい事は
Aブックの"ファイルA"シート内容をBブックのどこか解らないシートの最終行から下に値貼り付けするのですよね。

自動記録でもう一度この動作を記録してみましょう。
記録する時は、あらかじめBブックを開いておきます。

多分、
Rows("4:4").Select
Selection.Copy
Windows("Bブック.xlsx").Activate
 Rows("4:4").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
Application.CutCopyMode = False
Windows("Aブック.xlsm").Activate
こんな感じかな、、で
Windows("Bブック.xlsx").Activate は開いている時の対象なので
これを、
Workbooks .Open Filename:= Desktop Path & "\管理\ファイルB.xlsx"
n = Cells(Rows .Count, "A").End(xlUp).Row + 1
Range("A" & n).Select 
とすれば、値貼り付けが出来ると思います。

あと、気になるのは
Application .Screen Updating = False ''画面停止
のタイミング、現状は、NOで抜けるとそのままになりますよ。
なので、実行時のみで良いと思います。

>エラー保護含め改善策をお教えいただければ幸いです。
色々必要ですが、先に挙げたシートの問題やブックが無かった時の処理などですかね。

=行ってほしいところ=
そこに行く前に、
変数宣言、作成したプロシージャのデバッグ(コンパイル)と
この時2つのブック、2つのシートが登場しますが、ブック、シートを変数にセットするかWithなどで(明示して)まとめ、整理してみましょう
Select  Selectionの添削なども考えてみましょう。
=行ってほしいところEnd=

正直、コードを書く方が簡単なのだけれど、頑張りました。
エラールーチンの追加は、限定条件で良いので期待する結果が出力されるコードを作ってからに、で良いでしょうか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
早速試してみます。
変数、スペースがあるのは、なにかしらが引っかかって質問NGになってしまったので、コードがのせいかと思いスペース等をいれておりました。

お礼日時:2021/04/10 13:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!