こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

EXCEL VBA  人数分新規ブックを作成

お世話になります。

A.xlsというブックがあります。
A.xlsの中に[X月X日振込み]というシートがあります。
この[X月X日振込み]シートは以下のような感じです。
A列に氏名
B列には前月繰越額
C列には交通費

が人数分入力されています。

となりに[内訳表]というシートがります。

やりたいこと
[X月X日振込み]シートに[集計]というボタンを作成してボタンをクリックすると以下の動作を実現したいです。

(1)[X月X日振込み]シートのA2からデータのある最下行まで人数分(i)READして
(2)[X月X日振込み]シートA列(i)の氏名を[内訳表]シートのC2へ入力
(3)[X月X日振込み]シートB列(i)の前月繰越額を[内訳表]シートのD10へ入力
(4)[X月X日振込み]シートc列(i)の交通費を[内訳表]シートのD11へ入力
(5)以上の3項目を[内訳表]シートへ入力したら、デスクトップの[データ]というフォルダ配下に新規ブックを作成して保存。できればブックの名称も[シート名]+A列の氏名にしたいです。
・・これで1データの処理が終わり・・

あとは上記(2)~(5)を人数分実施

というようなイメージです。
どなたかロジックをご教授いただけますでしょうか?

何卒よろしくお願い致します。

環境 Windows7 Excel2013

投稿日時 - 2015-09-17 16:56:05

QNo.9049250

すぐに回答ほしいです

質問者が選んだベストアンサー

No2ですが、失礼しました。
肝心のコードを貼り付けていませんでした。

・保存時に読み取り用のパスワードをD列の内容で設定しました
 (D列が空欄の場合はパスワードがかかりません)
・ファイル操作による画面のちらつきを無くしました
・進捗状況を左下のステータスバーに%表示するようにしました
・同じファイルが有る場合に上書き保存を強制的に行うようにしました

以下のVBAコードと差し換えてください。

■VBAコード
Sub Sample()
Dim i As Long, mySt As Worksheet, rmax As Long
  '出力先のフォルダパスを指定
  Const dpath As String = "C:\Users\○○○\Desktop\データ\"
  'データのシートを格納
  Set mySt = ActiveSheet
  rmax = mySt.Cells(Rows.Count, "A").End(xlUp).Row
  '人数分繰り返し
  Application.ScreenUpdating = False
  For i = 2 To rmax
    '内訳表のシートを新規シートとして複製
    mySt.Parent.Worksheets("内訳表").Copy
    '新規シートに対する処理
    With ActiveSheet
      .Range("C2").Value = mySt.Cells(i, "A").Value '氏名を転記
      .Range("D10").Value = mySt.Cells(i, "B").Value '前月繰越額を転記
      .Range("D11").Value = mySt.Cells(i, "C").Value '交通費を転記
      '名前を付けて新規シートを保存(D列の値でパスワード設定付)
      Application.DisplayAlerts = False
      .SaveAs _
        Filename:=dpath & mySt.Name & mySt.Cells(i, "A").Value & ".xlsx", _
        Password:=mySt.Cells(i, "D").Value
      Application.DisplayAlerts = False
      '保存したブックを閉じる
      .Parent.Close
    End With
    Application.StatusBar = Int(i * 100 / rmax) & "%"
    DoEvents
  Next i
  Application.ScreenUpdating = True
  '終了メッセージ
  MsgBox "終了"
  Application.StatusBar = False
End Sub

投稿日時 - 2015-09-18 10:51:44

お礼

eden3616さん、早速のご連絡ありがとうございます!!

出来ましたー!!
もう完璧です!感動です。

本当に助かりました。
前回に引き続きご丁寧なご説明もいただきまして本当に
ありがとうございました!

投稿日時 - 2015-09-18 13:55:13

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

>ちなみに本日追加のオーダーがあったのですが、
>内訳表を人数分保存するときにパスワード設定して保存したいようなのです。
>そのパスワードは)[X月X日振込み]シートD列(i)に記述されているものを
>そのまま内訳表のパスワードとして設定したいようなのですが、

Excelで用いるパスワードには2種類あります。
(1)ファイルを名前を付けて保存時に「ツール」から「全般オプション→読み取りパスワード/書込みパスワード」を設定する場合
 →ファイルを開いたとき/保存するときにパスワードを確認し、
  不一致であれば適用しないこ場合に使用
(2)Excelメニューの校閲タブからシートの保護/ブックの保護でパスワードを設定する場合
 →ブックの構成やセルの内容を変更しないようにロックする場合に使用

今回は(1)の読取り用として設定しています。
書出したファイルを開く際にパスワード確認のダイアログが表示され、パスワードが一致しないと開くことが出来ません。開くことが出来れば、シートやブックの保護をしているわけではないため、値の変更は可能です。

要望と異なっていれば補足願います。

>このようなことは可能なのでしょうか??

Excelで作業できることはだいたい出来ます。
余談ですが、
Excelメニューの「表示→マクロの記録」を選択し、手作業で一連の作業をした後に、同メニューの「記録終了」で新規マクロが登録されます。
このマクロには手作業を行った動作が自動的に記録されます。
コードに慣れないうちは、「セルの選択」「セルの内容を変更」「名前を付けて保存」などの単発の作業を記録して、どのようなコードが記録されるのかでVBAを覚えていけばある程度触れるようになります。

投稿日時 - 2015-09-18 10:47:29

ANo.1

以下のSampleプロシージャを標準モジュールに記述し、
Const dpath As String = "C:\Users\○○○\Desktop\データ\"
の箇所を適切に変更してから、ボタンに登録してください。

コードについてはコメント入れてますので参考に。

■VBAコード

Sub Sample()
Dim i As Long, mySt As Worksheet
  '出力先のフォルダパスを指定
  Const dpath As String = "C:\Users\○○○\Desktop\データ\"
  'データのシートを格納
  Set mySt = ActiveSheet
  '人数分繰り返し
  For i = 2 To mySt.Cells(Rows.Count, "A").End(xlUp).Row
    '内訳表のシートを新規シートとして複製
    mySt.Parent.Worksheets("内訳表").Copy
    '新規シートに対する処理
    With ActiveSheet
      .Range("C2").Value = mySt.Cells(i, "A").Value '氏名を転記
      .Range("D10").Value = mySt.Cells(i, "B").Value '前月繰越額を転記
      .Range("D11").Value = mySt.Cells(i, "C").Value '交通費を転記
      '名前を付けて新規シートを保存
      .SaveAs Filename:=dpath & mySt.Name & mySt.Cells(i, "A").Value & ".xlsx"
      '保存したブックを閉じる
      .Parent.Close
    End With
  Next i
  '終了メッセージ
  MsgBox "終了"
End Sub

投稿日時 - 2015-09-17 17:30:36

補足

eden3616さん、ご連絡ありがとうございました!!
(当方からの連絡が遅くなりまして申し訳ございません)

ご教授いただきましたロジックで実現できました!!
分りやすくてとても勉強になります。
前回に続き本当にありがとうございました!

ちなみに本日追加のオーダーがあったのですが、内訳表を人数分保存するときにパスワード設定して保存したいようなのです。
そのパスワードは)[X月X日振込み]シートD列(i)に記述されているものをそのまま内訳表のパスワードとして設定したいようなのですが、このようなことは可能なのでしょうか??

投稿日時 - 2015-09-18 10:02:55

あなたにオススメの質問