- 締切済み
現金出納表の内容を別表の科目別欄に自動コピー出来ますか?
父が自治会の会計をやっています。 そこで質問されましたが、出来るかどうか私では?なので 皆様にお願いします。 似たような質問を見ても応用出来ず困っています。 **** 出金があるごとに「A表」に記入している内容を 項目別に区切ってある「B表」のそれぞれの項目の行に 自動的にコピーできないでしょうか? A表に記入=B表にも記入される というのが理想です。 A表は出金があるごとに詰めて記入しています。 B表は数行空行がありますが一杯になると行の挿入しています。 こんなアバウトな出金簿ですが、スマートな方法がありましたら教えてください。 エクセルは「ビジコン2級」VBAは初級本をクリアした程度です。 A表。。。(sheet1) 日付 科目 内容明細 金額 ・・・・・・・・・・・・・・・・ B表。。。(sheet2) 科目1 日付 内容明細 金額 ------- ------- ------- 科目2 日付 内容明細 金額 ------- ------- ------- 科目3 日付 内容明細 金額
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- fukuchan7
- ベストアンサー率51% (156/302)
No.4です。マニュアルが遅くなってごめんなさい。 文章だけでマニュアを作成するには、相当の時間と苦労が伴います。作成しかけたのですが、良く理解をしてもらえるかを考えると途中で挫折してしまいました。そこで考えたのは、書式をダウンロードして、要点をマニュアルで記載する方法です。一応書式は、ある会の書式ですがA4サイズ印刷を考えて過去の執行状況を調べ4半期毎の集計に設定しています。1ヶ月単位にする時は変更して下さい。決算書式も収入を上部、支出を下部にする場合は、費用項目や決算の収入/支出の部分はリストと共に順序を変えてください。書式モデルは、下記のURLから1週間以内にダウンロードして下さい。 記入マニュアルやリストは、非表示(最初のシートは、開いています。)していますので再表示で内容を見ることが出来ます。一度シュミレーションして内容を確認下さい。 要点マニュアルは下記のとおりです。 ・「リストの設定(入力規制で設定)」 あらかじめ「リスト」(予算項目)の用意(別シートでも可)をしておく。 (1) リストを入力したいセル範囲(費用項目)を選択し (2) メニューから「データ」→「入力規制」→「データの入力規制」の設定画面 (3) 「設定」タブ→「入力値の種類」で「リスト」を選択 (4) 「元の値」を選択→ G列のリストが入った範囲を選択(範囲がずれないように絶対参照になる) (5) 「OK」で完了→オートフィルでコピー ・ 列によって「英数字」か「かな漢字」入力かを自動的に切り替える (A)英数入力モードで「かな変換」を設定する (1) 設定範囲(摘要・備考)を選択→メニューから「データ」→「入力規制」→「データの入力規制」の設定画面(2) 「日本語入力」タブ→「ひらがな」→OK ・ 「収入」「支出」の入力がない時、[列/残高]に「0」表示をしない (1) IF関数を使いIF(AND(収入="",支出=""),"",前残高+収入―支出) Ex;「F5」に =IF(AND(D5="",E5=""),"",F4+D5-E5) →オートフィルでコピー ・ 予算項目別収支の支出(累計)額の計算(予算に対する支出管理) 各予算項目別支出累計執行計算書の作成(決算書の作成が出来るよう、予算(リストの費用項目と同じ)に対する支出及び収入の決算書式に対応した表を作成)→関数;SUMIF を使用 (1) 収支状況の支出のセルを選択→=を入力しSUMIF関数を選択→「=SUMIF()」と表示されダイアログボックスが表示される。計算式最初の費目を (2) 範囲欄に「会計簿の費用範囲」を設定→F4を押す(絶対参照) (3) 検索条件に「収支状況の最初の費目」を設定 (4) 合計範囲欄に「会計簿の支出範囲」を設定→F4を押す(絶対参照) (5) OK 関数式Ex; =SUMIF($B$5:$B$66,P5,$E$5:$E$66) (6) 「収支状況の支出のセル」からオーフィルで費用項目の最後までコピーをする(完了) 以上
- KenKen_SP
- ベストアンサー率62% (785/1258)
一般通常操作で、ほぼご希望のことができますので、ご紹介します。 1. 出納帳のシートをコピーします 2. コピーされた出納帳シートのデータ範囲を選択 3. EXCELメニュー[データ]-[集計]クリック 4. [集計の設定]ウインドウで次のように設定します グループの基準 = 科目 集計の方法 = 合計 集計するフィールド = 金額 集計行をデータの下に挿入する = チェック 5. [OK]クリック 6. [データ]-[グループとアウトラインの設定]-[アウトラインのクリア]クリック 7. 表の体裁を整える [マクロの記録]でこの一連の手順を記録すれば、ある程度のコードができあがります。記録されたコードそのままでは、まともに動作しないでしょうが、コードを修正すればmanchester2 さんオリジナルマクロが出来上がります。 上記は、RangeオブジェクトのSubTotalメソッドを利用した方法です。グループ化や集計などが簡単に行えるのですが、とにかく遅いです。matsu_jun さんがご回答されているコードの方が、リアルタイムで更新されますし、高速で、便利ですね。 御参考までに。
- matsu_jun
- ベストアンサー率55% (146/265)
ソースは多少不細工になりましたが、完成しました。 項目毎の最下行に小計を挿入するようにしました。小計を挿入する際、項目間は1行ずつ空けないと表がひどく見にくくなったので、こちらの判断で1行あけてから次の項目を表示するようにしました。 一番最後の項目の小計から、更に1行空けた上で、一番最後に総計を表示しています。 今回の改造で、表Aにあらかじめ罫線が引いてあった場合、もしかしたら非常に見にくいものになるかもしれません。その点につきましては悪しからずご了承願います。 さて、ここからはアドバイスですが、VBAが初心者とのこと。 私自身の経験ですが、VBAに限らず、プログラムは語学と同じだと思います。人間がやりたいことを、Excelというソフトが理解できる言葉に翻訳するということですから。 だから勉強法も語学と同じだと思います。(語学と違って発音の練習はありませんが) 私の以下のソースは稚拙な上に、ろくにコメントも記入していない駄作ですが、良いマクロがありましたら、それを日本語に翻訳することも立派な学習の一つだと思います。 また、VBAの学習のために、「マクロの記録」も役立ててください。任意の操作を記憶させた後にそのソースを翻訳するのも良いと思います。 教本に記載されているサンプルVBAも、ただ打ち込んで動作を確認するだけでなく、1行1行を翻訳してみるのが大事です。その際Visual Basic エディタの「デバッグ」メニューから、ステップイン(1行ずつ実行する F8キー押と同様)、ブレイクポイントの設定(ある行にこれを設定すると、そこで実行が中断する F9キー押と同様)の2つを活用して、1行1行の動きの変化を観察しながら見てみるといいですよ。 差し出がましいことを申しましたが、頑張ってくださいませ。 下のソースに不具合ございましたら、補足欄にでもご記入ください。修正いたします。 'ここから----------------------------------------------------------- Private Sub Worksheet_Activate() On Error GoTo ERREND Application.ScreenUpdating = False Worksheets("Sheet1").Columns("A:D").Copy Paste Destination:=ActiveSheet.Range("A1") Columns("A:A").Cut Range("C1").Insert Shift:=xlToRight Columns("A:D").Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range("B2") _ , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _ False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin i& = 2 SUB_TTL# = 0 STR_K$ = Empty Do Until (Cells(i, 1).Value = Empty) If Cells(i, 1).Value = STR_K Then Cells(i, 1).Value = "-------" SUB_TTL = SUB_TTL + Val(Cells(i, 4).Value) Else If i <> 2 Then Rows(i).Insert Shift:=xlDown Rows(i).Insert Shift:=xlDown Cells(i, 1).Value = "小計 ( " & STR_K & " )" Cells(i, 4).Value = SUB_TTL i = i + 2 End If SUB_TTL = Val(Cells(i, 4).Value) STR_K = Cells(i, 1).Value End If i = i + 1 Loop Cells(i, 1).Value = "小計 ( " & STR_K & " )" Cells(i, 4).Value = SUB_TTL Cells(i + 2, 1).Value = "総計" Cells(i + 2, 4).Value = Application.WorksheetFunction _ .Sum(Range(Cells(2, 4), Cells(i, 4))) / 2 ERREND: Application.ScreenUpdating = True End Sub 'ここまで-----------------------------------------------------------
- fukuchan7
- ベストアンサー率51% (156/302)
マクロは、解からないのですが、現在現金出納帳を記入しながら同時に科目別(人件費、消耗品、備品費など)の予算に対する項目別支出状況がわかる出納帳を作り自動的にその時点の執行状況(決算書)が出来上がるようにしています。 決算時には、決算報告書をわざわざ作る必要がないので大変便利です。 マニュアル作成に時間がかかりますので、このようなもので良ければ、アドバイスさせていただきます。 お返事下さい。
- matsu_jun
- ベストアンサー率55% (146/265)
#2のmatsu_junです。 #2で書いていたことをマクロにしました。以下のコードをB表に挿入してください。 なお、A表は「Sheet1」という名前のシート上にあると仮定しています。 A表の書かれたシート名が異なる場合、下のソースの3行目 Worksheets("Sheet1") のカッコの中を書き換えてください。 また、A表は列Aに日付、列Bに科目、列Cに内容詳細、列Dに金額の4列を利用しているものとします。 列数を増やしたい場合は、3行目 Columns("A:D").Copy のカッコの中を書き換えてください。 7行目の Columns("A:D").Sort のカッコの中も書き換えます。 列Aに日付、列Bに科目というのは必須条件とします。というのは、変えてもよいのですが、変えると下のソースの変更量が多くなってしまいますので(^^) 下のソースの内容を理解した上で、自己責任で変更してください。 B表の掲載されるシートのシート名は何でも構いません。これを変更しても下のソースの変更は不要です。 'ここから----------------------------------------------------------- Private Sub Worksheet_Activate() Application.ScreenUpdating = False Worksheets("Sheet1").Columns("A:D").Copy Paste Destination:=ActiveSheet.Range("A1") Columns("A:A").Cut Range("C1").Insert Shift:=xlToRight Columns("A:D").Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range("B2") _ , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _ False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin i& = 2 STR_K$ = Empty Do Until (Cells(i, 1).Value = Empty) If Cells(i, 1).Value = STR_K Then Cells(i, 1).Value = "-------" Else STR_K = Cells(i, 1).Value End If i = i + 1 Loop Application.ScreenUpdating = True End Sub 'ここまで----------------------------------------------------------- 貼り付け方が分からない時は以下をお読みください。 1) Excelの画面上で、Altキーを押しながらF11キーを押すと、「Microsoft Visual Basic」というタイトルの、VBAエディタが起動します。 2) その画面左側に、小さく「プロジェクト-VBAProject」と書かれたウィンドウがあり、何だかエクスプローラの左側のようになっている画面があると思います。 3) その中の、「VBAProject (○○○○.xls)」 (○○○○はExcelブックの名前)と書かれているアイコンの左側が「+」だったらそれをクリックしてください。「-」だったらその下を見てください。 4) 「Microsoft Excel Objects」と書かれたアイコンがあり、更にその下にシートの名前一覧があると思います。 5) B表の書かれたシート名をダブルクリックしてください。VBAエディタの右側が白くなり、文字を入力できるようになります。 6) その部分に、上の 'ここから----------------------------------------------------------- から 'ここまで----------------------------------------------------------- をコピーします。コピーしたら終了してください。
お礼
ありがとうございます。 昨日は時間が無くて作業をしなかったのですが、今朝早速そのままにコピー&ペーストさせて頂きましたら、出来ました。 プロシージャの記述の意味があまり分かっていないのに出来てしまってどきどきしています。 後、手を加えたときに崩れないかどうか心配です。 締め切らないでちょっとの間おかせてくださいね。
補足
ありがとうございます。今頑張ってやっています。が、VBAの初心者の”初”のレベルも私には無いようですのでお時間下さい。またメールします。
- matsu_jun
- ベストアンサー率55% (146/265)
A表に1行入力するたびにB表に反映させるのは少々難しいですね。 A表の一部を修正した場合や、A表の行削除などを行った時などの処理を 一つ一つ考えていくと、可能とは思いますが、大きなマクロになりそうです。 ただよく見ると、 1) A表の内容をB表のあるシートに上書き 2) B表のあるシートの「科目」列と「日付」列の順番の入れ替え 3) データ(D)-並べ替え(S)にて、最優先されるキーを「科目」 2番目に優先されるキーを「日付」にする 以上の操作でほぼお望みどおりの結果が得られるようですね。 あとは 4) 「科目」列において、それぞれの科目の先頭の行以外を 「-------」と書き換えていけば同じ結果が得られそうですね。 3)までの操作であれば、マクロの記録で何とかなりそうですね。 後は、 4)の処理ですが、例えば STRCMP$ = Worksheets("Sheet2").Cells(1, 1).Value i# = 2 Do Until Worksheets("Sheet2").Cells(i, 1).Value = Empty If STRCMP = Worksheets("Sheet2").Cells(i, 1).Value Then Worksheets("Sheet2").Cells(i, 1).Value = "--------" Else STRCMP = Worksheets("Sheet2").Cells(i, 1).Value End If i = i + 1 Loop のような処理を3)の処理の後に追加してやればよいですね。 (シート名などは必要に応じて読み替えてください) マクロの記録を行うと、「標準モジュール」に記録されますが、 この内容を、B表のシートが前面に表示される際に発生するイベント 「Worksheet_Activate」に書き込んでやれば、B表のシートを開く際 自動的に上記マクロを実行するので、ほぼ同様の使い勝手になるかと思います。
補足
さらに質問したいのですが、、、 sheet2のB表の各科目ごとに小計、最下行に総計を入れられますか? もしくは最右列に各科目ごとに累計が入る。 体裁のよい位置に総計を入れる。 入れるとしたら記述はどのようになるのでしょうか? 自力でちょっとやってみましたが失敗です。私には「真似る」しか出来ないみたいです。お願いします。
- KenKen_SP
- ベストアンサー率62% (785/1258)
<方法1> 出納帳であるA表をオートフィルターで科目別にデータ抽出すれば「科目別の明細」=B表、、やっぱボツですかね? <方法2> B表、つまり同一シートに複数の科目が存在するのが、やっかいですね。各科目ごとの最終行をどうやって取得するのかが難しいです。 科目ごとのシートに分けるのはどうでしょう。 参考URL先のNo.9のVBAコードで、A表の科目欄をキーにすれば、そのまま各科目ごとにシート分けできるかと思います。 つまり、A表に記入したら、一度既存の各科目ごとのシートを削除して、各科目ごとのシートを再構築。 この手順をマクロで自動化し、A表に「再集計」ボタンを置いて、簡単に実行できるようにしたら、どうでしょう。 すこし、コードをカスタマイズする必要がありますが。
補足
早速ありがとうございます。参考URLの質問を見て、手がかりにしようとゴチャゴチャやってみたのですが、初級本をやったくらいでは難解でした。とにかくどう考えて行けば良いのかが分からず投稿しました。 ご提案の方法1は、私も父に薦めたのですがとにかく入力が恐怖に感じている人種なので1度でおわりたいとか・・。皆さんの意見を順々にTRYしたいと思います。行き詰まったらまた助けてください。
補足
ありがとうございます。便利そうですね。今、先の回答者さんからのを頑張って試みていますので、急ぎませんのでよければ貴方のアドバイスもお願いします。でもできるかしら?心配。