Excel VBAで日付けの条件付き仕訳を行う方法

このQ&Aのポイント
  • Excel VBAを使用して、日付けの条件に基づいて仕訳を行う方法を教えてください。
  • 特定の列の日付けを確認し、指定の日付以前の行には「EOL」と入力し、指定の日付範囲内の行には「現行品」と入力する方法を教えてください。
  • また、条件に合致しない入力や空欄の場合には「N/A」と入力する方法も教えてください。
回答を見る
  • ベストアンサー

Excel VBA 日付けでIF/Else仕訳

図のようなリストがあります。 「発売日」の日付けを判断するVBAを教えてください。 ・オレンジ色のセルと「発売日」のE列は固定で移動しません。 ・データの最終行は未定(表による、ここでは17行目、No.13が最後のデータ) ・データのある右端の列も未定(表による) ・表のタイトル行(No. シリアル・・・)は固定(4行目) このようなシートに対して、次のような操作ができるVBAのコードを教えてください。 1. 「発売日」のE列を調べ、"G1"の"EOL最終日"と比較し、こお日"以前"の行は、  右端に"EOL"と入力する (EOLとは「End Of Life」で、部品サプライヤーが部品供給を終わったことを意味します) 2. "G1"の日付けの翌日から"G2"の日付け(当日含む)までの期間にある部品は現行品のため、"現行品"と入力する 3.E列でどちらにも該当しない入力、空欄、ゴミ入力などは”N/A”と入力する(これはElseでよい) 表の右端は現在の表ではF列の「備考」列ですが、表によっては誰かが列を増やしている可能性があるため、上記の入力は列の右の空いている未使用列に入力したい。 日付け形式で入力された列の、If / Elseif/ Else判定の仕方がわからずこまっています。 よろしくお願いします。

  • ketae
  • お礼率85% (292/340)

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1606/2443)
回答No.3

以下でいかがですか Sub Example() Dim MyLastRow As Long, MyLastColumn As Long Dim i As Long MyLastColumn = Cells(4, Columns.Count).End(xlToLeft).Column MyLastRow = Cells(Rows.Count, "A").End(xlUp).Row For i = 5 To MyLastRow If Not IsDate(Cells(i, "E").Text) Then Cells(i, MyLastColumn + 1).Value = "N/A" ElseIf Cells(i, "E").Value2 <= Cells(1, "G").Value2 Then Cells(i, MyLastColumn + 1).Value = "EOL" ElseIf Cells(i, "E").Value2 > Cells(1, "G").Value2 And Cells(i, "E").Value2 <= Cells(2, "G").Value2 Then Cells(i, MyLastColumn + 1).Value = "現行品" Else Cells(i, MyLastColumn + 1).Value = "N/A" End If Next End Sub

ketae
質問者

お礼

ありがとうございました。 実際の処理はこのコードをベースに手を加えて使用させていただきました。 くせがないコードで、理解しやすかったです。

その他の回答 (3)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

 回答No.1です。  もし判定をIf / Elseif/ Elseでやる場合には、最初に If 「日付ではない場合」Or「現行品の最終日よりも後の場合」 Then という構文使って”N/A”となる場合の判定と処理を先に行ってしまい、続けて Elseif 「EOL最終日以前」 Then という構文使って”EOL”となる場合の判定と処理を行い、最後に Else を使って上記のどれにも該当しない場合、即ち"現行品"となる 「日付である場合」で尚且つ「EOL最終日以降~現行品の最終日以前の場合」 の処理を行う様にすれば良い訳です。 Sub QNo9222033_Excel_VBA_日付けでIF_Else仕訳_別法() Const SearchColumn = "E" '発売日が入力されているの列の列番号 Const ItemRow = 4 '表中で項目名が入力されている行の行番号 Dim InputColumn As Long, LastRow As Long, i As Long, buf As Variant, temp As Variant _ , DateCell(1) As Range, OutputString(2) As String, LastDate(1) As Variant Set DateCell(0) = Range("G1") 'EOLの最終日が入力されているセル Set DateCell(1) = Range("G2") '現行品の最終日が入力されているセル OutputString(0) = "N/A" 'EOLでも現行品でもない場合に書き込む値 OutputString(1) = "EOL" 'EOLの場合に書き込む値 OutputString(2) = "現行品" '現行品の場合に書き込む値 For i = 0 To 1 LastDate(i) = DateCell(i).Value If Not IsDate(LastDate(i)) Then MsgBox DateCell(i).Address(False, False) & "セルに日付が入力されていません。" _ & vbCrLf & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If Next i InputColumn = Cells(ItemRow, Columns.Count).End(xlToLeft).column + 1 LastRow = Range(SearchColumn & Rows.Count).End(xlUp).row If InputColumn <= Columns(SearchColumn).column Or LastRow <= ItemRow Then MsgBox "処理すべきデータが見当たりませんません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If With Application .ScreenUpdating = False .Calculation = xlManual End With For i = ItemRow + 1 To LastRow temp = Range(SearchColumn & i).Value If Not IsDate(temp) Or temp > LastDate(1) Then buf = OutputString(0) ElseIf temp <= LastDate(0) Then buf = OutputString(1) Else buf = OutputString(2) End If Cells(i, InputColumn).Value = buf Next i With Application .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub

ketae
質問者

お礼

ありがとうございます。 また類似した質問をすると思いますが、よろしくお願いいたさいます。 いつもありがとうございます。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.2

こんにちは IF/Elseに拘らなければ、 Sub test()   Dim c As Long   c = WorksheetFunction.CountA(Rows(4))   With Range("A5", Range("A" & Rows.Count).End(xlUp)).Offset(, c)     .Formula = "=IF(OR($E5>$G$2,$E5=""""),""N/A"",IF($E5<=$G$1,""EOL"",""現行品""))"     .Value = .Value   End With End Sub とかでも。

ketae
質問者

お礼

ありがとうございます。 これは短くていいですね。 勉強課題として保管しておきます。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

 一例としては次の様なVBAマクロとなります。 Sub QNo9222033_Excel_VBA_日付けでIF_Else仕訳() Const SearchColumn = "E" '発売日が入力されているの列の列番号 Const ItemRow = 4 '表中で項目名が入力されている行の行番号 Dim InputColumn As Long, LastRow As Long, i As Long, buf As Variant, temp As Variant _ , DateCell(1) As Range, OutputString(2) As String, LastDate(1) As Variant Set DateCell(0) = Range("G1") 'EOLの最終日が入力されているセル Set DateCell(1) = Range("G2") '現行品の最終日が入力されているセル OutputString(0) = "N/A" 'EOLでも現行品でもない場合に書き込む値 OutputString(1) = "EOL" 'EOLの場合に書き込む値 OutputString(2) = "現行品" '現行品の場合に書き込む値 For i = 0 To 1 LastDate(i) = DateCell(i).Value If Not IsDate(LastDate(i)) Then MsgBox DateCell(i).Address(False, False) & "セルに日付が入力されていません。" _ & vbCrLf & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If Next i InputColumn = Cells(ItemRow, Columns.Count).End(xlToLeft).column + 1 LastRow = Range(SearchColumn & Rows.Count).End(xlUp).row If InputColumn <= Columns(SearchColumn).column Or LastRow <= ItemRow Then MsgBox "処理すべきデータが見当たりませんません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If With Application .ScreenUpdating = False .Calculation = xlManual End With For i = ItemRow + 1 To LastRow temp = Range(SearchColumn & i).Value If Not IsDate(temp) Then temp = "" Select Case temp Case Is <= LastDate(0) buf = OutputString(1) Case LastDate(0) + 1 To LastDate(1) buf = OutputString(2) Case Else buf = OutputString(0) End Select Cells(i, InputColumn).Value = buf Next i With Application .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub

ketae
質問者

お礼

ありがとうございます。 Set DateCell(0) ,OutputString(0)のところが、わたしの理解が申込し進まないと応用が難しそうです。 MsgBoxは取り入れさせていただきました。

関連するQ&A

  • Excel VBA 列の値を調べてフラグ立て

    図のようなリストのB列に商品番号が入っています。 ただし ・シリアル(番号)はB列に入っている(固定) ・データの最終行は未定(表による) ・データのある右端の列も未定(表による) このようなシートに対して、次のような操作ができるVBAのコードを教えてください。 1. データが入っている列の右端を調べ、そのさらに右列を入力列とする (ここではF、罫線など書式設定は不要) 2. B列(シリアル)のデータの左から3文字を検査し、ABCとなっている行は◯を入力する 3. B列の頭3文字のうち、XXの2文字がある場合(XXZでもAZZも=緑)、Aを入力する 4. B列の頭4文字以右に該当文字(ABCやXX)があっても該当しない(ピンクは対象外)。 5. 最終行の検証が終わったら終了(ここでは12行目が最終行) お時間のあるときでいいので、よろしくお願いします。 Excel 2010 or 2013

  • エクセルVBA 行追加時に自動で罫線を引きたい

    こんにちは。いつもお世話になっています。 エクセル2007を使用し、データーベースの表を作っています。 A列からE列まで情報の項目があり、(日付・名前等) 3行目からずっとデータを入力しています。 新しい行に、A列からE列の間に何か入力した時、 もしくは入力してある最終行にカーソルがある時、改行を押した場合 次の新規の行AからEまで、自動に罫線を引くにはどうしたらよいのでしょうか?

  • エクセルVBA 日付で抽出、並び替え

    こういう場で初めて質問させていただきます。 どうぞよろしくお願いします。 エクセルVBAで日付(月毎)でデータを抽出し、並び替えを行いたいのですが, B列に日付が入りC~F列には帳簿の仕訳が入ります。 ここで B2 に日付が入って、C2~F2とC3~D3にデータが入った場合に オートフィルタをかけたら、3行目は日付の欄が空白なので うまく抽出できません。 なお、2行目と3行目は1つの仕訳なのでばらばらになるのも困ります。   仕訳は最低1行から最大で6行になります。 このように日付欄は1行だけど、その日付に対応する内容が数行に渡って入るような場合に日付から月毎にデータ抽出するには どのようなコードを書けばいいのでしょうか? A B    C      D     E    F  日付 借方科目 金額 貸方科目 金額  10/10 消耗品  300    現金   500        雑費   200   10/9   交際費  500    現金   500   10/8    雑費   200     現金   200 汚い表ですが、上記のような場合です。 10/10の分は2行で1つになりますので、このような場合です。 どうかよろしくご指導お願いします。 

  • EXCELのDSUM関数で集計条件に日付を入れると数字が消える

        B列      C列     D列   E列      F列      G列 1行  日付      区分    金額   集計する条件 2   2000/1/1   A社   1000    区分     日付      日付 3   2000/1/10    B社    500   A社    >=2000/1/1  <2000/2/1 4   2000/1/15    A社    300    5   2000/2/5   A社     200    集計結果 6                        =DSUM(B1:D5,3,E2:G3) 上記のような表をEXCELで作成しました そのうちA社の1/1~1/31の金額をDSUM関数を利用して集計したく 上記のようにDSUM関数に引数を入力しました しかし集計条件が区分のみ(E2:E3)だとA社の2/5までの合計額1500が反映するのですが、日付を入れた途端に0になってしまうのです ちなみに、一例として日付→商品区分に直して日付の代わりに 「機械」「部品」といった文字を入力してみると ちゃんと条件通りの集計をしてくれます 日付の入力のしかたに間違いがあるのでしょうか? テキスト見ながらちゃんとやってると思いこんでるだけで 落とし穴にはまってるのだと思います 是非良きアドバイスをお願いします  

  • 日付を基準に 形式の違う表にデータを反映させたい

    Windows8.1を使っています。 新しい職場でデータ入力等の仕事なのですが、同じデータの入力なのに、入力する表のパターンが違うため 二度手間・三度手間なことをしています。 1つの表に入力したデータが、自動で別の表に反映させることができないかと思い、ご相談です。 自分でなんとか・・・と思いましたが、どこをどうして良いのか分からず・・・よろしくお願いいたします。 エクセルで、全く形式の違う表が別々のBookにあります。 Book(1)のシート1には、A列をあけてB列に上から日付が並んでます。 この時、同じ日付のデータ入力が多数あるので、同じ日付で12行あります。 その下に翌日の日付が12行、またその下に12行・・・といった感じです。 Book(1)シート1    A  B    C      D      E  F  G   H   I     J     K    L  M・・ 1                    2014年7月                        2  ×  日付  得意先  現場  × ×  ×  名前1  ◆  ◆  名前2  ◆  ◆ ・・   3  ×  7/1   山    田中邸           ✓  TRUE  1  ✓  TRUE  1       4  ×  7/1   海    鈴木邸                       ✓   TRUE   2      5  ×  7/1   川    林邸            ✓  TRUE  2                  ~~~~~~~~ 14 ×  7/1                                            15 ×  7/2                                            16 ×  7/2                                            同じ日付12行に、得意先・現場を入力。名前の列にはチェックボックスを作り、チェックしたら右横のセルに反映します。7/1のH3にチェックをしたら、◆I3はTRUEになり、◆J3に「1」と反映するようにしました。 A・E・F・G列は、また違う書式に反映するデータを入力しているので、ここでは「×」としました。 同じ日付で12行ありますが、その日の現場数が5件なら5行、10件なら10行の入力です。 このシート1の表を基に、Book(1)のシート2には、シート1のチェックボックスの結果が反映するようにしました。 チェックボックスにチェックをしてTRUEになった行の「日付」「得意先」「現場」を、名前ごとに見られるような表です。(これは、作っておくと後々楽かなあという軽い気持ちで作りました。)   Book(1)シート2     A     B      C      D     E      F      G     H      I  ・・・   1 日付  得意先  現場   日付  得意先  現場  日付  得意先  現場・・・・  2 7/1      山    田中邸   7/1    山     田中邸                   3 7/1      川    林邸      7/1    海     鈴木邸                   4  5 ものすごく見づらくて分かりづらいと思いますが、Book(1)のシート1のH3にチェックをしたら、シート1のB3・C3・D3のデータが シート2のA・B・C列に反映します。シート1のK列にチェックしたら シート2のD・E・F列に。シート1のN列にチェックしたら シート2のG・H・I列に。 シート1の名前1さんのデータは、シート2のABC列、名前2さんはDEF列、名前3さんはGHI列、といった感じです。 問題はここからで、このBook(1)のデータをBook(2)の表に自動で反映できないものかと。。。 Book(2)の表がまた全然違う表なんです。 Book(2)     A      B     C     D      E      F      G      H    I    J    K   1 2 3   日付   曜日    名前1   名前2   名前3   名前4    名前5   名前6 4  6/21 5   6/22 6  6/23 ~~~~~~~~~ 14  7/1 15  7/2 16  7/3 このBook(2)の日付と名前の交わるセルに、Book(1)シート1もしくはシート2の「得意先」「現場」のデータを反映させたいのです。 Book(1)シート1もしくはシート2の日付と Book(2)の日付を連動させて・・・ ややこしいんですが、Book(1)は日付が1日~末日。Book(2)は21日~翌20日。 Book(1)は一月分のデータ(あるのはシート1・シート2くらい)、Book(2)は一年分のデータ(シートが月で分かれていて、シートが2014.1 2014.2 2014.3 2014.4・・・というようになっています。 Book(2)は昔からこの表でやってきたので、基本の形は変えたくないようです。 ただ、Book(2)の表は入力するセルが各一つしかないので、見た目は同じようにしながら作り直そうかと思ってます。 どうか、ご指導・アドバイス等お願いいたします。 知識がないばっかりに、分かりづらく、説明も下手くそですみません。 そして、画像の貼付に何度も失敗し、手入力の見づらい画面ですみません(T T))

  • エクセルの貼り付けについて

    添付画像の様にB列に入力してあるデータを 8行ずつずらしながら、 B列のデータがどこに入っているかを 分かるような表をFからG列で作成しています。 8×3行が終わったら2行下の所からまた8×3行 と入れていきたいのですが、 例えば14行目のE・F・Gの数式を編集しないといけなく、 実際は8×12で運用しているので、 手間がかかります。 簡単に貼り付けるだけで 新しい入力欄ができるようにはできないでしょうか? よろしくお願いします。

  • エクセルVBAで質問です

    下のような表を作っています。 A列に日付がある限り、B、C、D、E列それぞれの列に対して、 3行目以降のデータが検索値と同じであれば、そのひとつ上の行の 値をG、H、I、J列にそれぞれ上から順に入れていきたいのですが、 どのようになるでしょうか。 A1 月日 B1 検索値1・・・B3以降データ C1 検索値2・・・C3以降データ D1 検索値3・・・D3以降データ E1 検索値4・・・E3以降データ G2以降に検索値1で調べた値 H2以降に検索値2で調べた値 I2以降に検索値3で調べた値 J2以降に検索値4で調べた値 例えば、B1の検索値が1であり、B10に1があったとします。 この場合、ひとつ上のB9の値をG2に来るようにしたいのです。 説明下手ですが教えていただけないでしょうか。

  • エクセルVBAの書き方で教えてください。

    エクセルで、 「A列にデータを入力した日付をB列に自動で入れる」 (A列のデータを消したときは、B列のデータも消える)ということをするのに、 他の質問を参考にして、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then   '対象の列が1列目(A列)なら If Target.Value <> "" Then   '入力された値がブランクでなければ Target.Offset(0, 1).Value = Date   '0行ずれた(同じ行)の1列右隣に日付を入れる Else       'そうでなければ(Deleteキーで消されたら) Target.Offset(0, 1).Value = ""   '同行右隣をブランクすなわち""として消す End If      '入力された値の処理終り End If      '1列目(A列)の処理終り、従ってB列以降はチェックしない End Sub と、入力して、うまく動きました。 ところが、「A列に入力」→「B列に自動で日付」だけでなく、 「D列に入力」→「E列に自動で日付」 「H列に入力」→「I列に自動で日付」と、1つのエクセルシートの中で いくつかの同じ条件のことを繰り返そうと思うとうまくいきません。 この場合、どのようにVBAを記入したら良いのか、教えてください。 よろしくお願いします。

  • エクセル 日付の修正

    お尋ね致します。 あるエクセルの表なんですが、A列が、31001(令和3年10月1日)という形の日付になっています。 これをyyyy/mm/ddに変えるため、B列の全行に2021と入力し、C列にmid関数で月を取り出し、D列にright関数で日を取り出し、この3列を使ってE列をdate関数で2021/10/01 にしています。 これよりスマートな方法があったらご教示願えませんでしょうか? ちなみに最後の形はR3/10/01でもOKです。

  • エクセルVBA  「本日」の日付を検索したいのですが

    お世話になります。 シートを開いたときに、日付列を検索して本日と同じ日付(日付列に本日と同じ日付がなければ、前日や前々日など、近い日)の一番最初のセルをアクティブにしたいのです。 素人なのですが、教えていただけるでしょうか。 理由ですが、 エクセルで文書受付簿をつくり、利用しています。 受付簿であるシート名 台帳  で受付記録をしているのですが、 別シート  コピー用『前年度』データ   というものを作ってあります。 それは、前年度の受付内容をコピーしたものであり、必要なセルをダブルクリックするとシート  台帳  の最終行に貼り付けるようにVBAを組んでいます。 (毎年同じ件名の文書が来る場合は、ダブルクリックするだけで入力できるので、手間が省けます) 同じ件名の文書は、だいたい同じ時期に来るので、シート  コピー用『前年度』データ   を開いた際に、日付列を検索して本日と同じ日付(日付列に本日と同じ日付がなければ、前日や前々日など、近い日)の一番最初のセルをアクティブにしたいのです。 ただし、まったく同じ日に去年も同じ件名の文書がくるわけではないので、同じ日を抽出するのではなく、検索してセルをそこに合わせるということをしたいのです。 コピー用『前年度』データ   の状況は、 A列は日付です。この日付は、表示は「月日」のみですが、数式バーには2006/4/5と表示されるように、年の情報も入っています。年は無視して、月日だけで検索したいのです。 一日に20件以上受付するので、日付も同じ日が20行近く続いて次の日の受付データに変わります。その日のまとまりの中で、一番上の行に合わせたいのです。 B列は相手先が入っています。 C列は文書の件名が入っています。 つたない説明ですが、お分かりいただけたでしょうか? よろしくお願いいたします。

専門家に質問してみよう