Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2019)
請求金額を集計したい
投稿日時: 23/04/25 09:17:02
投稿者: furenet

御教授下さい
 
社員が作った請求書の金額を集計するマクロを作成したいと思っております。
 
途中まで作成したのですがマクロ初心者なので分からない事ばかりです
 
 
したいことは
 
 
集計表というエクセルファイルがあります。
 
この集計表のマクロを実行すると、ダイアログが開き、請求書が保存されている任意のフォルダを選択します
 
フォルダ内にある社員が作成した請求書のエクセルファイルを開いて、R2に表示してある請求金額をコピーします。
 
コピーした請求金額を集計表のC5に貼り付けます。
 
請求書ファイルを閉じます。
 
 
 
請求書はいくつもあるのですが確認の意味もあり一つずつ開きながらしたいと思っております。
 
 
どうか教えて頂けたらと思います。宜しくお願い致します。
 
 
 

回答
投稿日時: 23/04/25 10:35:42
投稿者: taitani
投稿者のウェブサイトに移動

作成依頼はNGですよ。
https://www.moug.net/faq/kiyaku.html
/// 引用開始 ///
■禁止事項
 
コード制作依頼
「●●●を実行するようなマクロを作りたいのですが」「●●●をする方法を教えてください」といった、コード制作依頼ともとれるような質問はおやめください。
 
/// 引用終了 ///
 
支援を希望しているのなら、作成途中のコードを提示するとか、エラーが発生している内容を提示するとか。
サンプルデータを提示するなど。

回答
投稿日時: 23/04/25 16:42:15
投稿者: WinArrow

>途中まで作成した
自分でトライしたコードを掲示して、添削して貰う方がよいです。
 
 
マクロ作成時の考え方
マクロの記録を利用します。
処理を分割する
 
今回は、入力側として、複数のブック(ファイル)が対象になります。
(1)1つのファイルを開く操作をマクロの記録でコードを作成する。
1つ目のアイルと2番目のファイルはアイル名だけが異なるので、
ファイル名部分を変数化する。
 
そして、閉じる操作もコードを作成します。
 
複写処理は、「開く」と「閉じる」の間にコードを作成します。
 
 
次に、1つ目のブックの複写元から、集計表シートのセルに複写する操作をマクロの記録でコードをs区政する。
1つ目のブックの複写先は、C5セルですが、2番目は、違いますよね。
2番目以降をどこに複写するかは、あなたが考えうことです。
 
これらのコードを変数化して、組立ます。
 
VBA初心者といっても、ピンキリだから、
内容が理解できるならば、参考にしてください。

回答
投稿日時: 23/04/26 10:31:25
投稿者: Suzu

furenet さんの引用:
請求書はいくつもあるのですが確認の意味もあり一つずつ開きながらしたいと思っております。

 
マクロは自動化を行う為に使います。
 
【】内を作業者が行う処理だとして
今の質問者さんの動作イメージだと
1.【マクロ実行】
2.ダイアログを表jし、処理対象となるファイルを選択
3.ファイルを開く
4.【R2または他のセルの値を確認】
    確認し正しいなら.R2のセルの値を、集計表のC5に張り付ける
    確認し誤りなら何もしない
5.ファイルを閉じる
6.マクロ終了
 
4. の動作で、操作者の確認判断が入るのであれば、
その段階で、マクロは中断し作業効率としては大きな改善は見込めないのではないでしょうか?
 
 
それよりは、
1) 集計表のセルに、対象となるファイルのフルパスを入力しておく
2)【マクロ実行】
3) 1で入力してあるフルパスを参照し対象となるファイルを開く
4) R2(確認しなければならないセルがあるならその)値を取得し請求書ファイルに貼り付け
5) ファイルを閉じる
6) 1の対象となるファイルの一覧が無くなるまで 3. からの動作を繰り返す
7) マクロ終了
の動作の方が効率的と思いますが いかがでしょうか?
 
参考までに。
こんなデータがある時
	A	B	C	D	E
1	No	フォルダ	ファイル	A2	B2
2	1	C:\DATA\	AA.xlsx
3	2	C:\DATA\	BB.xlsx
4	3	C:\DATA\	CC.xlsx
5	4	C:\DATA\	DD.xls

 
D/E列にデータを転記するコード
Sub Sample()
  '開いたブックのコピー元アドレス
  Const target1 As String = "A2"
  Const target2 As String = "B2"

  Dim FSO As Object 'Scripting.FileSystemObject
  Dim wbk As Workbook '開くブック
  Dim wst As Worksheet  'アクティブシート
  '(集計表ファイルの転記先シートをアクティブにしておく)

  Dim i As Long
  Dim strFilePath As String

  Set wst = ActiveSheet
  Set FSO = CreateObject("Scripting.FileSystemObject")

  i = 2
  '2行目から開始
  Do
    'B列&C列 のフォルダ-ファイル を繋ぎファイルパス取得
    strFilePath = wst.Cells(i, 2).Value & wst.Cells(i, 3).Value
    'ファイルの存在確認
    If FSO.FileExists(strFilePath) = True Then
      'ファイルがある時
      'ファイルを開く
      Set wbk = Workbooks.Open(Filename:=strFilePath, ReadOnly:=True)
      'セル内容 D列、E列へ転記
      wst.Cells(i, 4).Value = wbk.Worksheets("Sheet1").Range(target1).Value
      wst.Cells(i, 5).Value = wbk.Worksheets("Sheet1").Range(target2).Value
      'ファイルを閉じる
      wbk.Close
    End If
    '次の行を処理する
    i = i + 1
    'A列の値が空白になるまでループする
  Loop While Not IsEmpty(wst.Cells(i, 1))

'後始末
  Set wst = Nothing
  Set wbk = Nothing
  Set FSO = Nothing
  MsgBox "終了"
End Sub

 
コードを改造すれば希望の動作ができると思います。
改造がんばってみてください。

投稿日時: 23/04/29 14:44:49
投稿者: furenet

色々と御迷惑をおかけしてすいません。
 
マクロは少ししか分からないので改めてまたご質問させて頂きます。
 
返答頂いた方々有難うございました。