- ベストアンサー
二枚のシートから各シートへの抽出
- 会計処理する上で、普通預金シートと現金シートがあり、明細を記入していきます。項目には日付、摘要、収入、支出、残高があります。会議費を含む明細を記入する場合、普通預金と現金シートに別々に記入する必要がありますが、これを会議費シートに自動で追加する方法があるかどうか教えてください。
- 現在の方法では、会議費を支払った場合には普通預金と会議費の2枚のシートに記入しなければならず、間違いが起こりやすくなっています。したがって、普通預金か現金のどちらかのシートに記入すると、会議費シートに自動で反映されるようにしたいと考えています。
- 会議費シートを作成し、普通預金と現金シートに記入された会議費の明細を自動で追加する方法はありますか?現在の方法では、同じ明細を2枚のシートに記入する必要があり、分かりづらくなっています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.2です! 続けてお邪魔します。 前回の続きです。 「現金」Sheet見出し上で右クリック → コードの表示 → VBE画面に↓のコードをコピー&ペースト Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'この行から Dim k As Long k = Cells(Rows.Count, 2).End(xlUp).Row If Cells(k, 7) = 1 Then Call ThisWorkbook.会議費マクロ End If End Sub 'この行まで 同様に「普通預金」Sheetにも全く同じコードで良いですのでコピー&ペーストしてみてください。 尚、会議費SheetのH列に作業用の列が見えていますが、目障りであればH列を非表示にしておいてください。 尚、すべてのSheetにまだデータがない場合は「会議費マクロ」は実行する必要ありません。 「現金」「普通預金」Sheetに入力すれば自動的に「会議費」Sheetに反映されると思います。 お役に立てば良いのですが、他に良い方法があればごめんなさいね。m(__)m
その他の回答 (2)
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! なかなかご希望の動きができないようですが・・・ VBAでの方法を持ってきました。 一例です。 ↓の画像(小さくて見づらいかもしれません)のような配置でやってみました。 Sheet名は 「現金」・「普通預金」・「会議費」としています。 画面左下のSheet見出し(とりあえず「会議費」Sheet)上で右クリック → コードの表示 → VBE画面が出ますので、 表示された左側のほうに「Thisworkbook」があると思いますので、そこをダブルクリック 新たに画面が表示されますので、↓のコードをコピー&ペーストしてマクロを実行してみてください (Alt+F8キー → マクロ → マクロ実行です) Sub 会議費マクロ() 'この行から Dim ws1, ws2, ws3 As Worksheet Dim i, j, k As Long Set ws1 = Worksheets("現金") Set ws2 = Worksheets("普通預金") Set ws3 = Worksheets("会議費") For i = 7 To ws1.Cells(Rows.Count, 2).End(xlUp).Row + 1 On Error Resume Next If ws1.Cells(i, 7) = 1 And WorksheetFunction.CountIf(ws3.Columns(8), _ ws1.Name & ws1.Cells(i, 2) & ws1.Cells(i, 3)) = 0 Then With ws3.Cells(Rows.Count, 2).End(xlUp).Offset(1) .Value = ws1.Cells(i, 2) .NumberFormatLocal = "yy/mm/dd" .Offset(, 1).Value = ws1.Cells(i, 3) .Offset(, 2) = ws1.Cells(i, 4) .Offset(, 3) = ws1.Cells(i, 5) .Offset(, 6) = ws1.Name & ws1.Cells(i, 2) & ws1.Cells(i, 3) End With End If Next i For j = 7 To ws2.Cells(Rows.Count, 2).End(xlUp).Row + 1 If ws2.Cells(j, 7) = 1 And WorksheetFunction.CountIf(ws3.Columns(8), _ ws2.Name & ws2.Cells(j, 2) & ws2.Cells(j, 3)) = 0 Then With ws3.Cells(Rows.Count, 2).End(xlUp).Offset(1) .Value = ws2.Cells(j, 2) .NumberFormatLocal = "yy/mm/dd" .Offset(, 1).Value = ws2.Cells(j, 3) .Offset(, 2) = ws2.Cells(j, 4) .Offset(, 3) = ws2.Cells(j, 5) .Offset(, 6) = ws2.Name & ws2.Cells(j, 2) & ws2.Cells(j, 3) End With End If Next j k = ws3.Cells(Rows.Count, 2).End(xlUp).Row Range(ws3.Cells(4, 2), ws3.Cells(k, 8)).Sort key1:=ws3.Cells(4, 2), order1:=xlAscending End Sub 'この行まで あっ!2000文字を超えそうなので 別Sheetのコードはもう一度投稿します。m(__)m
- imogasi
- ベストアンサー率27% (4737/17069)
質問する上で下記を知って置いてください 再質問なら、前の質問番号を参考までに記す。前との関連がわかって質問が理解しやすい場合もある。 本コーナーの画像貼り付けなんだが、くっきりしたものもあるが、ぼやけて見難いとか、文字が小さすぎて見えない、とかが多い。本件も一度読者の立場で質問を見てください。見えないのではないですか。 現実問題を簡略化して、エクセルシートに例をつくり、それを質問文章の中にデータを貼り付けてほしい。 私は回答で、ほぼ全問で逆のことをしてます(エクセルのシート上で回答内容をテストし、シートをコピーして回答文に貼り付ける)。列の左右位置が乱れることもあるが。 ーー 本件の質問文ですが判りにくい。 シートは2つらしいが >普通預金」シートと「現金」シート >普通預金」と「会議費 とバラバラの表現になっている。 >項目には「日付」「摘要」「収入」「支出」「残高」があります。 は2シートともこの項目なのか >そこで項目に「番号」を追加し、下記の通りに置き換えます。会議費=1 はどちらのシートか? 番号というよりも費目「コード」(列を作る)が適当だろう。 >「会議費」シートを作成し 第3のシートを作るのか? 読み直して、他に解釈されないか推敲のこと。回答者も下記など1時間ぐらいかかるのだ。 ーーーー 質問者の技量が書いてないので判らないが、VBAは出来ず、関数ばかりを頼るなら、難しいと思う。 と言うのは関数では、条件(=本件では会議費)で該当行を別シートに抜き出すのは難しい。 Googleでimogasi方式で照会すれば、このコーナーに出た抜き出し問題で、数百は出てくると思う。しかし INDEX、MATCH、SMALL関数を組み合わせた数式 配列数式 imogasi 方式 その他の方式 VBAなどの方式 による回答があると思うが、1番目の方式の式の理解が難しいと思う。 良ければ勉強して使えば良い。 素直なのはフィルタオプションの設定で、会議費の項目の在る行を別シートに抜き出すことだ。 ただこの方式は、データ入力が1月分などまとめて入力が終わってからの方法で、入力の都度反映の方式ではない。 ーー 参考までに imogasi方式は 例データ Sheet1 日付 費目 金額 作業列 2011/3/1 交際費会費費 1 2011/3/2 定例会議費 2 1 2011/3/3 文具費 3 2011/3/4 交際費 4 2011/3/5 消耗品費 5 2011/3/6 交通費 6 2011/3/7 接待会議費 7 2 2011/3/8 会議費補助 8 3 だ行列はD列で D2には =IF(COUNTIF(B2,"*会議費*")=0,"",MAX($D$1:D1)+1) 会議費だけの表現しかないなら、式はもっとわかりやすく*は要らない。 会議費という語句が含まれていたら、上からの会議費の行の最大番号に+1して、連番を作る、と言う意味。 ーー 次にSheet2で ($C$30の部分は適当数に設定のこと) A2に =INDEX(Sheet1!$A$2:$C$30,MATCH(ROW()-1,Sheet1!$D$2:$D$30,0),COLUMN()) これをC列まで式複写 A2:C2の式を下方向に式複写 Sheet2の行番号ROW()を頼りに、SheetのD列に1,2,3・・も行を見つけて、その各列のデータを引っ張ってきている。 #N/AはD列のMAXを超えたら戸要ったIF関数をかぶせて、見えなくする(略)。 結果 2011/3/2 定例会議費 2 2011/3/7 接待会議費 7 2011/3/8 会議費補助 8 #N/A #N/A #N/A ーー このやり方はSheet2の式を適当に多数の行に用意しておけば、Sheet1で会議費行が増える都度、Sheet2に反映する。 これとてもSheet2はデータのセルすべて関数式で埋まるので、データが1000行とかを越えると(増えたとき)動作はどうなるか判らない。