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

エクセル(2013)のマクロについて質問です。
作業完了報告書から別BOOKの台帳へ、毎回、転記をしております。
これらをマクロにしたいのですが、どのようにすれば宜しいでしょうか。

できれば、作業完了報告書に登録のマクロボタンをつけて、
報告書の記入を終える→登録ボタンを押す→台帳へ自動転記(最下行)

また、エクセル以外の方法もあるならば、教えていただけると幸いです。

宜しくお願いいたします。

「エクセル2013で作業完了報告書から台帳」の質問画像

A 回答 (6件)

こんにちは、


マクロはどの程度、知識がありますか?
>これらをマクロにしたいのですが、どのようにすれば宜しいでしょうか。
作業完了報告書から処理を行う場合、
処理の流れとしては、台帳.xlsxを取得して、同時にシートを取得
そこに対して作業完了報告書の内容を書き込みします。

下記に(掲示図の)サンプルを書きますが、
おそらく他の処理も必要になるのではと思います。
ある程度、VBAの知識をお持ちであると想定して書いていますので、悪しからず。

>できれば、作業完了報告書に登録のマクロボタンをつけて、
>報告書の記入を終える→登録ボタンを押す→台帳へ自動転記(最下行)
です。
サンプルでは、台帳.xlsxは、デスクトップに保存されているものとしています。
違うようであれば、実際のパスに書き換えてください。

シート名は、共にSheet1です。
' .Save
' .Close
の ' を削除すると台帳.xlsxは保存して閉じられます。

処理の流れ
パス、ファイル名などを変数に代入
ターゲット(台帳.xlsx)が指定のパスに存在するか検証
有った場合、既に開かれているか開かれていないか検証
開いていなければ、開いて変数にセット
シートは1枚とは限らないので、シート名Sheet1をアクティブにする

自ブックの対象シート、対象セルの値を
セットした台帳.xlsxブックのシート、セルに書き込み


Sub Output_FileData()
Dim MyBk As Workbook, TrgBk As Workbook
Dim TrgRow As Long
Dim TrgBkname As String, Path As String, FileFllpath As String

Set MyBk = ThisWorkbook
TrgBkname = "台帳.xlsx"
Path = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\"
FileFllpath = Path & TrgBkname
'// 存在チェック
If (Dir(FileFllpath) <> "") Then
Else
MsgBox ("指定パスには、対象ブックがありません。")
Exit Sub
End If
On Error Resume Next
Open FileFllpath For Append As #1
Close #1
If Err.Number > 0 Then
'// 既に開かれている場合
Set TrgBk = Workbooks(TrgBkname)
Sheets("Sheet1").Activate '台帳のシート名
Else
'// 開かれていない場合
Set TrgBk = Workbooks.Open(FileFllpath)
Sheets("Sheet1").Activate '台帳のシート名
End If

Application.ScreenUpdating = False
Application.DisplayAlerts = False
With TrgBk
With .ActiveSheet
TrgRow = .Cells(Rows.Count, "A").End(xlUp).Row + 1
.ActiveSheet.Cells(TrgRow, "A").Value = MyBk.Sheets("Sheet1").Range("E2").Value
.ActiveSheet.Cells(TrgRow, "B").Resize(, 2).Value = Application.Transpose(MyBk.Sheets("Sheet1").Range("B2:B3").Value)
End With
' .Save
' .Close
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

 (MyBk.Sheets("Sheet1")のSheet1は、作業完了報告書のシート名)

書き込んでいるのは、この2行
.ActiveSheet.Cells(TrgRow, "A").Value = MyBk.Sheets("Sheet1").Range("E2").Value
.ActiveSheet.Cells(TrgRow, "B").Resize(, 2).Value = Application.Transpose(MyBk.Sheets("Sheet1").Range("B2:B3").Value)

手直しが必要かもしれませんが、取敢えず
    • good
    • 0
この回答へのお礼

Qchan1962さん、こんにちは。

マクロは勉強中でございます。
教えていただいたマクロもだいたい理解はできるのですが、
台帳の方に記載ができませんでした。
[Application.ScreenUpdating = False]から
上手く作動していないのかなと思われます。

教えていただいたマクロを元に、考えてみようと思います。
ありがとうございました。

お礼日時:2020/09/29 22:37

TrgBk.Sheets("台帳").Cells(TrgRow, "A").Value = MyBk.Sheets("Sheet1").Range("E2").Valueとかいているのなら、


With TrgBk、With .ActiveSheet 及び閉じる
End With
End Withは不要です。

必須
シート名を変更している場合、Sheets("Sheet1").Activateは、エラーになります。
従って、返信のコードの場合、Sheets("台帳").Activate とする必要があります。
 '台帳のシート名は、2か所

サンプルのコードは、ファイルが開いているかどうかをエラー発生で確認して
分岐している為、On Error Resume Nextを実行しています。
なので、途中で他のエラーが発生してもスルーして実行されます。
なので、改修しにくいかも知れません。

試しに
On Error Resume Next を 'On Error Resume Next として
台帳ブックを閉じ マクロを実行してみてください。
台帳ブックが開いていると Open FileFllpath For Append As #1 で
エラーになります。閉じていれば、エラー無く実行できますが、
他の箇所に問題があれば、エラーが返されますので、そのコードをご確認ください。

ちなみに
MyBk.Sheets("Sheet1").Range("B2").Value
MyBk.Sheets("Sheet1").Range("B3").Value
このセルアドレスは、ご質問の添付図とは異なりますので、ご確認ください。

MyBkは、Set MyBk = ThisWorkbook なのでマクロが実行されているブックです。確実に作業完了報告書ブックがアクティブな状態からマクロを実行するのであれば、ThisWorkbookをActiveWorkbookに変更した方が良いかもしれません。

今後も処理内容を変更(追加)したい場合、このあたりの処理を理解する事が
必要になりますので、頑張ってください。
    • good
    • 0
この回答へのお礼

いろいろとお世話をお掛け致しました。

何故、「1」が入力されていたのか不明ですが、
無事に自動転記することが出来ました。

本当にありがとうございました。

お礼日時:2020/09/30 12:08

#4です


野暮用で時間がないので、確認だけ、
先ず、参照元のセルアドレス、入力先のセルアドレスを確認してください。
Resizeなどが難しくしている場合は、1セルずつ=で結んで試してください。

また、TrgRow = .Cells(Rows.Count, "A").End(xlUp).Row + 1 最終行プラス1
、新規行を調べている列は、台帳.xlsxのSheet1のA列です。

出力先を他の列にした場合は、最終行を取得できる列に変更してくださいね。
>担当欄(C2)に「日付」と入力されます。
TrgRow = .Cells(Rows.Count, "C").End(xlUp).Row + 1
    • good
    • 0
この回答へのお礼

最終行に増えていくのはできました、ありがとうございます。

セルの確認をしているのですが、
台帳のブックの会社欄(B2)に「1」と入力されるだけです。

そもそも、この「1」がどこからでてきたのかわからず、
調べております。

Application.ScreenUpdating = False
Application.DisplayAlerts = False
With TrgBk
With .ActiveSheet
TrgRow = TrgBk.Sheets("台帳").Cells(Rows.Count, "A").End(xlUp).Row + 1
TrgBk.Sheets("台帳").Cells(TrgRow, "A").Value = MyBk.Sheets("Sheet1").Range("E2").Value
TrgBk.Sheets("台帳").Cells(TrgRow, "B").Value = MyBk.Sheets("Sheet1").Range("B2").Value
TrgBk.Sheets("台帳").Cells(TrgRow, "C").Value = MyBk.Sheets("Sheet1").Range("B3").Value
End With
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

このような、マクロで試してます。
(わかりにくいので、台帳のSheet1は台帳に名前を変更いたしました。)

お礼日時:2020/09/30 09:12

おはようございます。


手直しをさせて申し訳ありませんが、参考なので、ご理解ください。
ご自身でその修正をして頂ければ、転記処理を増やす等する時も容易に出来ると思いますので、

>何回マクロを実行しても下の行に増えなかったです。

With TrgBk
With .ActiveSheet
TrgRow = .Cells(Rows.Count, "A").End(xlUp).Row + 1

Cellsの前の . ありますか? With TrgBk も消してはダメですよ。

手直しが上手くいかない場合は、再度追記してください。

ResizeやApplication.Transposeが混乱を招いているのであれば
.Cells(TrgRow, "B").Value =MyBk.Sheets("Sheet1").Range("B2").Value
.Cells(TrgRow, "C").Value =MyBk.Sheets("Sheet1").Range("B3").Value
と同じです。
(参考なので、コード内のセルアドレスの場合)
    • good
    • 0
この回答へのお礼

おはようございます。
いえ、教えてくださるだけでもありがたいので、
手直し等はお気になさらないでください。

消してないのですがうまくいきません。
おっしゃる通り、
「.Cells(TrgRow, "B").Value =MyBk.Sheets("Sheet1").Range("B2").Value」
に変えてみたのですが、
会社欄(B2)に「1」、担当欄(C2)に「日付」と入力されます。

どこから「日付」がきているのか、日付と入力いているセルを
他の文字に変えてみたのですが、「日付」と入力されてしまいます。

そして、やはり、2行目以降に入力されませんでした。

他の方法も、探ってはみているのですが、「1」が入力されたりで・・・・・。
セル内の文字を変更して対応されなかったりと、苦戦しております。

お礼日時:2020/09/30 08:24

#2です。


失礼しました。
>だいたい理解はできるのですが、
良かったです。

With .ActiveSheetを後入れして消したつもりでした。
該当部分を下記の様に訂正します。

With .ActiveSheet
TrgRow = .Cells(Rows.Count, "A").End(xlUp).Row + 1
.Cells(TrgRow, "A").Value = MyBk.Sheets("Sheet1").Range("E2").Value
.Cells(TrgRow, "B").Resize(, 2).Value = Application.Transpose(MyBk.Sheets("Sheet1").Range("B2:B3").Value)
End With
    • good
    • 0
この回答へのお礼

度々ありがとうございます。

試してみたのですが、
台帳の会社と担当欄のみ(B2,C2)に「1」と入力されるだけでした。
また、何回マクロを実行しても下の行に増えなかったです。
もう少し考えてみようと思います。

お礼日時:2020/09/30 07:15

マクロなど使わなくても、単純に別ファイル参照でリンクを貼っておけばいいでしょう。


https://dekiru.net/article/12523/
    • good
    • 0
この回答へのお礼

タマタマポチさん、
早速のご回答ありがとうございます。
作業完了報告書は作業を完了する度に発行されるので、別ファイル参照でリンクを貼るとなると、毎回リンクを繋げなくてはならないので、転記するのと変わらなくなります。又、リンクが切れることがあるので、あまり使用したくないのが現状です。
誠に申し訳ございません。

お礼日時:2020/09/29 14:53

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