[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『締めと支払』(DAN)
取引先と20締め翌月20支払の契約になっているのですが 相手側がドルでの取引のため通常の会計ソフトが使用できません。 下記のような事はできますでしょうか?ご教授お願いいたします。
Sheet1 A1 B1 C1 D1 契約No IV No. Cost SHIP DAY 0001 02-001 USD10000 2009/12/18 0001 02-001 USD30000 2009/12/21 0001 02-001 USD5000 2010/01/11
sheet2 A1 B1 C1 D1 日付 2010 01 契約No IV No. Cost SHIP DAY 0001 02-001 USD30000 2009/12/21 0001 02-001 USD5000 2010/01/11
上記のようにシート1に伝票入力をし シート2に年と月を入れれば2009/12/21〜2010/01/20までの 伝票だけがでてきて一覧で出せる様にしたいと思います。
またもし可能であればシート2の一覧をプリントアウトすれば シート1のE列にプリントアウトした行は「済」と入力されれば最高です。
マクロ・関数どちらでも結構です。 よろしくお願いいたします。 Ver.2007 OS:Vista
マクロです \Sheet1/シートタブを右クリック→コードの表示 下記コートをコペピ
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim lstR As Long If Target.Address(0, 0) <> "E1" Then Exit Sub If MsgBox("表示行を印刷してE列に済をマークします", vbOKCancel) = vbCancel Then Exit Sub lstR = Cells(Rows.Count, "D").End(xlUp).Row Range("D2:D" & lstR).SpecialCells(xlCellTypeVisible).Offset(0, 1).Value = "済" Range("A1:D" & lstR).PrintPreview End Sub
シート1 にオートフィルタを設定→D列▼オプション→抽出条件を2009/12/21以上、2010/01/20以下に設定→OKボタン マクロはシート1のE1をダブルクリックで動きます シート2は使いません (エナン大好き)
DANさん こんばんは! 少し時間があったので作ってみました。 簡単に説明を入れていますので応用して頂けると幸いです。 「済」の扱いがよくわからないので印刷したのもだけに入る様にしています。 後のフォローが出来るかどうかわかりませんが、もしも出来なかったらお許しください。 Sheet2のコードモジュールに貼り付けます。 久々に書いたので、ちょっと自信ないです。間違っていたらごめんちゃいです。 一応、動作確認はしています。 では、では、また Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim MyDateA As Date Dim MyDateB As Date Dim MyAry() As Variant Dim MyA As Variant Dim i As Long Dim j As Long Dim k As Long '複数選択を不可 If Target.Count > 1 Then Exit Sub 'Targetが"B1:C1"にあるか判定 If Intersect(Target, Range("B1:C1")) Is Nothing Then Exit Sub '両方が数値であるか判定 If Application.Count(Range("B1:C1")) <> 2 Then Exit Sub 'MyDateAで当月の20日締めを作成 MyDateA = DateSerial(Range("B1").Value, Range("C1").Value, 20) '日付と判定出来なければExit If Not IsDate(MyDateA) Then MsgBox "日付と認識出来ません......" Exit Sub Else '日付と判定されれば先月の21日をMyDateBに格納 MyDateB = DateSerial(Range("B1").Value, Range("C1").Value - 1, 21) End If 'Sheet1のデータをMyAに取得 With Sheets("Sheet1") MyA = .Range("A1", .Range("A" & .Rows.Count).End(xlUp)).Resize(, 4).Value '済を格納するために二次元方向へ拡張 ReDim Preserve MyA(1 To UBound(MyA, 1), 1 To UBound(MyA, 2) + 1) End With 'MyAの一元上限までループ For i = 1 To UBound(MyA, 1) 'SHIPDAYが先月の21日以上で且つ当月の20日以下かを判定 If MyA(i, 4) >= MyDateB And MyA(i, 4) <= MyDateA Then '変数kをインクリメント k = k + 1 '配列MyAryを拡張 ReDim Preserve MyAry(1 To 4, 1 To k) 'MyAryの一次元上限までへループ For j = 1 To UBound(MyAry, 1) 'MyAryにMyAを代入 MyAry(j, k) = MyA(i, j) Next '抽出結果を代入 MyA(i, UBound(MyA, 2)) = "済" End If Next 'イベントを停止 Application.EnableEvents = False With Range("A1") '抽出先を一行下げてクリア .CurrentRegion.Offset(1).ClearContents '抽出されたものがあればMyAryの行列を入れ替えて出力 If k > 0 Then .Offset(1).Resize(UBound(MyAry, 2), UBound(MyAry, 1)).Value = Application.Transpose(MyAry) If vbYes = MsgBox(k & " 件のデータが抽出されました" & vbCrLf & _ "印刷しますか?", vbYesNo) Then '取りあえずプレビュー Me.PrintPreview With Sheets("Sheet1") 'Sheet1をクリア .Cells.ClearContents '済の入ったMyAを出力 .Range("A1").Resize(UBound(MyA, 1), UBound(MyA, 2)).Value = MyA End With End If Else MsgBox MyDateB & " 〜 " & MyDateA & " に該当するデータはありません................." End If End With 'イベントを解除 Application.EnableEvents = True Erase MyAry, MyA End Sub (SoulMan)
お返事遅くなり申し訳ございません。 分かりやすい解説付きで本当にありがとうございます。 後は何とか自力でアレンジしてみます。 本当に助かりました。ありがとうございました。 (DAN)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.