電子書籍の厳選無料作品が豊富!

VBAコードにより、入力シート(振替伝票作成用)から振替伝票の印刷と現金出納帳に転記する一括で処理するボタンで、日ごとに現金出納帳に記録していますが、当日のデータを転記すると、前日の記録行から下の3行目に記録されてしまいます。その都度、コピーして手直しなければならず困っています。教えて下さい。なお、コードは以下のとおりです。但し、cashbookのコードは添付していません。Sub 現金①出納帳()
Dim mRow As Long
Dim sh9 As Worksheet
Dim sh4 As Worksheet
Dim startRow As Long
Dim targetDate As Date
Dim targetRow As Long
Set sh9 = Worksheets("振替伝票①")
Set sh4 = Worksheets("現金①出納帳")
If Not IsDate(sh9.Range("J2").Value) Then Exit Sub
targetDate = DateSerial(Year(sh9.Range("J2").Value), Month(sh9.Range("J2").Value), 1) ' 対象月の1日を取得
' s91のB列で対象月の1日と一致する最初の行を検索
startRow = 1 ' 検索開始行
Do While startRow <= 441
If Month(sh9.Cells(startRow, "B").Value) = Month(targetDate) And Year(sh9.Cells(startRow, "B").Value) = Year(targetDate) Then
targetRow = startRow
Exit Do
End If
startRow = startRow + 1
Loop
Select Case Month(sh9.Range("J2").Value)
Case 4: mRow = 7 ' 4月の開始行
Case 5: mRow = 44 - targetRow ' 5月の開始行
Case 6: mRow = 81 - targetRow ' 6月の開始行
Case 7: mRow = 111 - targetRow ' 7月の開始行
Case 8: mRow = 155 - targetRow ' 8月の開始行
Case 9: mRow = 192 - targetRow ' 9月の開始行
Case 10: mRow = 229 - targetRow ' 10月の開始行
Case 11: mRow = 262 - targetRow ' 11月の開始行
Case 12: mRow = 299 - targetRow ' 12月の開始行
Case 1: mRow = 340 - targetRow ' 1月の開始行
Case 2: mRow = 377 - targetRow ' 2月の開始行
Case 3: mRow = 414 - targetRow ' 3月の開始行
End Select
Call cashbook_main(mRow)
End Sub

質問者からの補足コメント

  • ⇒sh4の12/1の行は303行目になります。⇒sh4の12/2の行は304行目になります。⇒sh4の12/3の行は305行目になります。⇒sh4の12/4の行は306行目になります。⇒sh4マクロで設定しています。⇒パターン②です。
    Public Sub cashbook_main(mRow As Long)・・一部省略・・For Row = 2 To maxrow
    key = sh9.Cells(Row, "C").Value  dicT(key) = Row・・・一部省略します・・・・
    sh4.Cells(Row + mRow, "C").Value = sh9.Cells(5, "W").Value '日
    sh4.Cells(Row + mRow, "B").Value = sh9.Cells(5, "U").Value '月
    MsgBox ("現金①出納帳に転記します")

      補足日時:2024/12/15 20:03
  • 再追加
    Public Sub cashbook_main(mRow As Long)
    Dim sh4 As Worksheet
    Dim sh9 As Worksheet
    Dim maxrow As Long
    Dim Row As Long
    Dim dicT As Object
    Dim key As Variant
    Set sh4 = Worksheets("現金①出納帳")
    Set sh9 = Worksheets("振替伝票①")
    Set dicT = CreateObject("Scripting.Dictionary")
    maxrow = sh9.Cells(Rows.Count, "C").End(xlUp).Row
    For Row = 2 To maxrow
    key = sh9.Cells(Row, "C").Value
    dicT(key) = Row
    Next

      補足日時:2024/12/15 20:06
  • 追加2
    '伝票番号を記憶
    key = sh9.Cells(7, "Z").Value
    If dicT.exists(key) = False Then
    MsgBox ("伝票番号=" & key & "は振替伝票①にありません")
    Exit Sub
    End If
    If sh9.Cells(14, "AP").Value = "" Then
    MsgBox ("合計が未表示です")
    Exit Sub
    End If
    If sh9.Cells(5, "Q").Value = "" Then
    MsgBox ("年が未表示です")
    ElseIf sh9.Cells(5, "Q").Value > 2 Then
    sh4.Cells(5, "B").Value = sh9.Cells(5, "Q").Value
    Else
    Exit Sub
    End If

      補足日時:2024/12/15 20:08
  • 追加3
    Row = dicT(key)
    sh4.Cells(Row + mRow, "L").Value = sh9.Cells(7, "AA").Value '名前
    sh4.Cells(Row + mRow, "X").Value = sh9.Cells(14, "AP").Value '金額
    sh4.Cells(Row + mRow, "C").Value = sh9.Cells(5, "W").Value '日
    sh4.Cells(Row + mRow, "B").Value = sh9.Cells(5, "U").Value '月
    sh4.Cells(Row + mRow, "N").Value = sh9.Cells(19, "Z").Value '他店数

      補足日時:2024/12/15 20:10
  • 追加3
    sh4.Cells(Row + mRow, "M").Value = sh9.Cells(19, "X").Value '他
    sh4.Cells(Row + mRow, "O").Value = sh9.Cells(19, "AA").Value '店
    sh4.Cells(Row + mRow, "D").Value = sh9.Cells(7, "Z").Value '店別伝票番号
    sh4.Cells(Row + mRow, "E").Value = sh9.Cells(8, "Z").Value '店別伝票番号
    sh4.Cells(Row + mRow, "F").Value = sh9.Cells(9, "Z").Value '店別伝票番号

      補足日時:2024/12/15 20:12
  • 最終追加です。
    sh4.Cells(Row + mRow, "G").Value = sh9.Cells(10, "Z").Value '店別伝票番号
    sh4.Cells(Row + mRow, "H").Value = sh9.Cells(11, "Z").Value '店別伝票番号
    sh4.Cells(Row + mRow, "I").Value = sh9.Cells(12, "Z").Value '店別伝票番号
    sh4.Cells(Row + mRow, "J").Value = sh9.Cells(13, "Z").Value '店別伝票番号
    MsgBox ("現金①出納帳に転記します")
    End Sub

      補足日時:2024/12/15 20:13

A 回答 (8件)

パターン②の前提で、Sub 現金①出納帳()を修正し、現金①出納帳2()


を作成しました。
こちらで試してください。
尚、
MsgBox ("J2の日付=" & tMonth & "/" & tDay & " mRow=" & mRow)
は、確認用です。不要になりましたら、削除してください。


Sub 現金①出納帳2()
Dim mRow As Long
Dim sh9 As Worksheet
Dim tYear As Long
Dim tMonth As Long
Dim tDay As Long
Dim mx As Long
Set sh9 = Worksheets("振替伝票①")
If Not IsDate(sh9.Range("J2").Value) Then Exit Sub
tYear = Year(sh9.Range("J2").Value)
tMonth = Month(sh9.Range("J2").Value)
tDay = Day(sh9.Range("J2").Value)
mx = tMonth - 4
If mx < 0 Then mx = mx + 12
mRow = 6 + mx * 37 + tDay
MsgBox ("J2の日付=" & tMonth & "/" & tDay & " mRow=" & mRow)
Call cashbook_main(mRow)
End Sub
    • good
    • 0
この回答へのお礼

長時間にわたり有難うございました。試行してみます。

お礼日時:2024/12/16 11:55

すみません。

No6の訂正です。
パターン②の
mRowは1~31の値になるべきのように思われますが・・・・?

mRowは7~37の値になるべきのように思われますが・・・・?
の誤りです。
    • good
    • 0
この回答へのお礼

有難うございます。文字がオーバーしそうなので、オーバーする分は後で送ります。>mRowの値(記録開始行)の決め方がよくわかりません。
⇒順序として、まず「台帳」のC列に1からの一連番号があり、固定セルに顧客IDを入力すると例えば1番の行に「日付、顧客名」が表示される。セル参照(=台帳!B2)で「入力シート」の日付をSh9にはB列に=台帳!B7で日付を取得しています。Sh9で振替伝票を作成するため、J2セルに日付を入力すると振替伝票にデータが入り、印刷します。と同時にsh4の「現金出納帳」に転記する流れになっています。Sh4のB列は月、c列は日が表示されます。従って、パターン②ではと思います。
パターン①
J2セルの日付(日の1~31で決まる)が決まれば、自動的に決まる。(月は無関係)
4月1日・・・7行
4月2日・・・8行
4月30日・・・36行
5月1日・・・7行
5月8日・・・8行
5月31日・・37行
以下同様
もし、そうであれば、B列を2行目から検索する処理は不要です。
パータン②
>sh9.Range("J2").Value の月に応じて mRow の値が設定され、
>”J2”に4/2と入力したら7行目、    (4/1の誤りと思われる)
>5/2なら44行目・・・などなのです   (5/1の誤りと思われる)
⇒誤りでした。最初に記録される行です。
mRowの値は、以下のようになるということですか。
J2の値
4月1日・・・7行
4月8日・・・8行
5月1日・・・44行
5月2日・・・45行
⇒そうなります。月の最初の日が最初の行になります。
もし、そうであれば、B列を2行目から検索する処理は不要です。
mRowは7~37の値になるべきのように思われますが・・・・?
cashbook_main(mRow)で、mRowをどのように使っているのかが提示されれば、判るかも知れません。
⇒sh9のデータをsh4に転記するコードを添付いたします。

そもそも、B列の日付は、手入力で設定しているものなのでしょうか。
⇒手入力ではなく台帳のB列の日付セルを参照し下にコピーしています。
それとも、マクロで自動設定しているものなのでしょうか。
⇒マクロではないです。

お礼日時:2024/12/15 19:40

すみません。


そもそもの話になりますが、不明点です。

mRowの値(記録開始行)の決め方がよくわかりません。

パターン①
J2セルの日付(日の1~31で決まる)が決まれば、自動的に決まる。(月は無関係)
4月1日・・・7行
4月2日・・・8行
4月30日・・・36行
5月1日・・・7行
5月8日・・・8行
5月31日・・37行
以下同様

もし、そうであれば、B列を2行目から検索する処理は不要です。


パータン②
>sh9.Range("J2").Value の月に応じて mRow の値が設定され、
>”J2”に4/2と入力したら7行目、    (4/1の誤りと思われる)
>5/2なら44行目・・・などなのです   (5/1の誤りと思われる)

mRowの値は、以下のようになるということですか。
J2の値
4月1日・・・7行
4月8日・・・8行
5月1日・・・44行
5月2日・・・45行

もし、そうであれば、B列を2行目から検索する処理は不要です。
mRowは1~31の値になるべきのように思われますが・・・・?
cashbook_main(mRow)で、mRowをどのように使っているのかが提示されれば、判るかも知れません。

パターン③
現在、プログラムで行っていることをただ素直に、解釈しただけの仕様。
1.sh9のJ2セルの年、月を取得。
2.sh9のB列を2行から検索し、J2の年月に一致する最初の行を取得する。
3.その一致した行番号を各月の基準値から減算した結果を、mRowへ設定する。

そもそも、B列の日付は、手入力で設定しているものなのでしょうか。
それとも、マクロで自動設定しているものなのでしょうか。
常識的に考えると、以下のようにならないといけません。
j2=12/1の場合、mRowが7になるべきなので、296行目12/1の日付があること。
j2=12/2の場合、mRowが8になるべきなので、295行目12/2の日付があること。
j2=12/3の場合、mRowが9になるべきなので、294行目12/3の日付があること。
j2=12/4の場合、mRowが10になるべきなので、293行目12/4の日付があること。

上記のように、手入力又はマクロで日付を設定しているのでしょうか?


上記のどのパターンなのでしょうか。もしくは、上記以外なのでしょうか。
    • good
    • 0
この回答へのお礼

有難うございます。少し確認いたします。

お礼日時:2024/12/15 18:02

>しかし、行間がずれる問題は同じ状態です。


>J2セルに12/12と入力し実行すると、8行目に記録するデータなのですが、ずれて16行目に表示されます。
>どうも、12月の1日からの記録が、1行ごとに+1、+2、+3・・と行がずれていくようです。

8行目に記録するということは、mRowの値が8になれば、良いということでしょうか?(記録開始行はmRowの値である)
そうであれば、mRowが8になるためには、TargetRowは291でなければいけません。B列の291行目に2024年の12月のデータがある必要があります。そして、2から290行には、2024年の12月があると期待した結果になりません。そのようになっているかチェックしてください。

もし、mRowの値が記録開始行でないなら、mRowがどのような値なのか、そして、記録開始行になるべき変数は、どのようにして求めているかの説明がないと、回答ができません。
    • good
    • 0
この回答へのお礼

有難うございます。頂いたコードを試行しました。⑦⑧のB1セルの型式の件、日付に修正し正常に作動いたしました。なお、mRow = 291に+4して、「Case 12: mRow = 295 - targetRow ' 12月の開始行」を試行したら、309行目に適正に記録されました。12月の行は302行目「繰越」行、303~以降が記録行です。>8行目に記録とは:繰越行から7行目までデータが記録されています。現行は8行目から記録する状態です。>mRowの値が記録開始行でないなら、・・ :については、「mRowの値は、開始行の値です。日ごとに行に記録していくので記録行が1行ずつ移動していくのですが、ずれる原因がわかりません。- targetRowなのかと思うのですが、どう修正して良いかわかりません。今は、記録の都度、mRowの値をその都度修正して記録しています。>記録開始行になるべき変数は、どのようにして求めているか:sh9.Range("J2").Value の月に応じて mRow の値が設定され、”J2”に4/2と入力したら7行目、5/2なら44行目・・・などなのです。よくわかっておらず説明が不十分だと思いますが、ご理解いただければ幸いです。

お礼日時:2024/12/15 11:16

>修正し、実行したのですが、他の原因でディバックが発生しました。



修正したのは、7,11,12月の基準値である、
111,262、269を118,266,303にしただけでしょうか。
もし、そうであれば、1行目でエラーが発生することは、考えにくいです。

マクロ修正時に、sh9のB1セルの内容、又は商品券売上台帳!B93か
sh9のJ2セルの内容を書き換えていませんでしょうか。
そうであれば、それが原因になります。

上記で解決しない場合は、以下のマクロを実行してください。

Sub 現金①出納帳()
Dim mRow As Long
Dim sh9 As Worksheet
Dim sh4 As Worksheet
Dim startRow As Long
Dim targetDate As Date
Dim targetRow As Long
Dim tYear As Long '①
Dim tMonth As Long '②
Dim wYear As Long '③
Dim wMonth As Long '④
Set sh9 = Worksheets("振替伝票①")
'Set sh4 = Worksheets("現金①出納帳")
If Not IsDate(sh9.Range("J2").Value) Then Exit Sub
targetDate = DateSerial(Year(sh9.Range("J2").Value), Month(sh9.Range("J2").Value), 1) ' 対象月の1日を取得
tYear = Year(targetDate) '⑤
tMonth = Month(targetDate) '⑥
s91のB列で対象月の1日と一致する最初の行を検索
startRow = 1 ' 検索開始行
Do While startRow <= 441
wYear = Year(sh9.Cells(startRow, "B").Value) '⑦
wMonth = Month(sh9.Cells(startRow, "B").Value) '⑧
'If Month(sh9.Cells(startRow, "B").Value) = Month(targetDate) And Year(sh9.Cells(startRow, "B").Value) = Year(targetDate) Then
If wMonth = tMonth And wYear = tYear Then '⑨
targetRow = startRow
Exit Do
End If
startRow = startRow + 1
Loop
Select Case Month(sh9.Range("J2").Value)
Case 4: mRow = 7 ' 4月の開始行
Case 5: mRow = 44 - targetRow ' 5月の開始行
Case 6: mRow = 81 - targetRow ' 6月の開始行
Case 7: mRow = 118 - targetRow ' 7月の開始行
Case 8: mRow = 155 - targetRow ' 8月の開始行
Case 9: mRow = 192 - targetRow ' 9月の開始行
Case 10: mRow = 229 - targetRow ' 10月の開始行
Case 11: mRow = 266 - targetRow ' 11月の開始行
Case 12: mRow = 303 - targetRow ' 12月の開始行
Case 1: mRow = 340 - targetRow ' 1月の開始行
Case 2: mRow = 377 - targetRow ' 2月の開始行
Case 3: mRow = 414 - targetRow ' 3月の開始行
End Select
Call cashbook_main(mRow)
End Sub

------------------------------------------
①~⑧が追加行です。
⑨は修正行です。(前の行をコメントにしています)

上記を実行して、⑤⑥の何れかで止まるならJ2セルの内容が不正になります。⑦⑧で止まるなら、B1のセルの内容が不正になります。(商品券売上台帳!B93の可能性もあります)

⑨で止まるなら、tYear,tMonth,wYear,wMonthにマウスをあてたとき、
期待しない数値が設定されている箇所が、エラーの個所です。
(tYear,tMonthの何れかならJ2セル、wYear,wMonthの何れかならB1セル)
    • good
    • 0
この回答へのお礼

有難うございました。エラーが直りました。⑧で止まりました。B1セルを確認したら、「日付」の項目でしたので、「startRow = 1 ' 検索開始行」を=2に修正し、実行したところ、作動できました。しかし、行間がずれる問題は同じ状態です。J2セルに12/12と入力し実行すると、8行目に記録するデータなのですが、ずれて16行目に表示されます。どうも、12月の1日からの記録が、1行ごとに+1、+2、+3・・と行がずれていくようです。

お礼日時:2024/12/14 21:38

エラーが発生したときのエラーメッセージの内容は、何が表示されましたでしょうか。



エラー発生時の状態で、マウスを、startRowに合わせると、その時の
startRowの値が表示されます。その値がB列でエラーが発生している行です。
そのセルの内容は、正しい日付が設定されてますでしょうか。
    • good
    • 0
この回答へのお礼

有難うございます。今12月のデータを処理しています。>コードのエラーは「型が一致しない」と表示されます。>またstartRow=1と表示します。>日付の設定ですが、sh9のB列の日付は、sh3の日付け(2024/12/12)を参照(=商品券売上台帳!B93)して、12/12と表示しています。>セルの内容は、正しく設定しています。

お礼日時:2024/12/14 18:36

mRow算出時の7,44,81等の値は、一か月に37行とすると、


添付図のようになります。
7,11,12月の値がおかしくないでしょうか?(添付図の黄色のセル)
一か月が37行なら、
7,11,12月は、118,266,303になるはずです。
「入力シートから日毎に帳簿に転記するコード」の回答画像2
    • good
    • 0
この回答へのお礼

いつも有難うございます。ご指摘いただいた基準値は37行に修正しました。ご指摘とおり行数は月毎のページ全体を37行にしています。同じシートの縦に各月のシートを作成し、各月の記録行は6行目からです。なので6行目は繰越行のため7行目からの記録となります。修正し、実行したのですが、他の原因でディバックが発生しました。申し訳ございませんが、原因を教えていただけませんか?「If Month(sh9.Cells(startRow, "B").Value) = Month(targetDate) And Year(sh9.Cells(startRow, "B").Value) = Year(targetDate) Then」 なお、”B”は日付で12/14 ユーザ定義でm/d;;;で設定しています。

お礼日時:2024/12/14 13:41

こんにちは



全体がどのようなレイアウトなのかもまったく不明ですし、ご提示のコードは行位置を調べているだけなので、ご質問の「転記」する部分は記されていないように思われます。
ですので、どの変数が転記に使われているのかすら回答者には不明です。
(多分、mRowなのかなと推測はしますけれど・・)

>前日の記録行から下の3行目に記録されてしまいます。
どのようなケースでも、確実に「3行目」から記録されてしまうというのであれば、単純に転記のスタート行をマイナス1(「1行目」をどこに考えるかによってはマイナス2かも?)しておけば良いと考えられます。

ただし、上記は対処療法的な発想ですので、『どのようなケースでも確実に』が正しくないと、とんでもない改悪となる危険性も高いです。
一方で、そのコードを作成した方なら、きちんと全体像をご存じのはずでしょうから、そちらに相談なさるのがベストの解決方法だと思われます。
    • good
    • 0
この回答へのお礼

早速に有難うございました。tatumaru77の先生にご教授頂きます。

お礼日時:2024/12/14 13:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A