プロが教える店舗&オフィスのセキュリティ対策術

記録行が2~30行のA帳簿で、伝票番号1はA帳簿に該当するので、2行目に記録されます。次の伝票番号2は、A帳簿に該当しなかったので、該当するB帳簿に記録され、A帳簿の3行目は空白行となります。次の伝票番号3は、A帳簿に該当したため、A帳簿に記録されますが、4行目に記録されるが、3行目が空白行として記録されてしまいます。空白行の対処に悩んでいます。行間を空けないで記録できるコードを教えて下さい。現在のコードは、Sh1のM18セルに数値がある場合は、Sh14の行に記録されるが、Sh1のM18セルの数値が0の場合には、Sh14の行が空白となります。なお、Sh14を記録は別のコードにA帳簿を呼び出し転記するようにしています。コードは補足に添付します。

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

  • Public Sub Giftbook_main(mRow As Long)
    Dim sh10 As Worksheet
    Dim sh1 As Worksheet
    Dim sh9 As Worksheet
    Dim maxrow As Long
    Dim Row As Long
    Dim dicT As Object
    Dim key As Variant
    Dim lastRow As Long '最後の記録行を追跡する変数
    Set sh10 = Worksheets("A商品券受払帳")
    Set sh1 = Worksheets("入力シート")
    Set sh9 = Worksheets("振替伝票①")
    Set dicT = CreateObject("Scripting.Dictionary")

      補足日時:2023/07/10 19:36
  • maxrow = sh9.Cells(Rows.Count, "AT").End(xlUp).Row
    For Row = 2 To maxrow
    key = sh10.Cells(Row, "A").Value
    dicT(key) = Row
    Next
    '伝票番号を記憶
    key = sh1.Cells(2, "Q").Value
    If dicT.exists(key) = False Then
    MsgBox ("売上伝票番号=" & key & "は入力シートにありません")
    Exit Sub
    End If

      補足日時:2023/07/10 19:38
  • If sh1.Cells(18, "M").Value = "" Then
    MsgBox ("枚数が未表示です")
    Exit Sub
    End If
    If sh1.Cells(7, "L").Value = "" Then
    MsgBox ("年が未表示です")
    ElseIf sh1.Cells(7, "L").Value > 2 Then
    sh10.Cells(7, "D").Value = sh1.Cells(7, "L").Value
    Else
    Exit Sub
    End If
    Row = dicT(key)
    If sh1.Cells(18, "M").Value = "0" Then

      補足日時:2023/07/10 19:39
  • Else
    sh10.Cells(Row + mRow, "F").Value = sh1.Cells(7, "C").Value '名前
    sh10.Cells(Row + mRow, "K").Value = sh1.Cells(18, "M").Value '枚数
    sh10.Cells(Row + mRow, "E").Value = sh1.Cells(7, "N").Value '日
    sh10.Cells(Row + mRow, "D").Value = sh1.Cells(7, "M").Value '月
    sh10.Cells(Row + mRow, "G").Value = sh1.Cells(2, "Q").Value '伝票番号
    End If
    'A商品券受払帳に転記する。

      補足日時:2023/07/10 19:41
  • If sh1.Cells(18, "M").Value <> "0" And sh1.Cells(18, "M").Value <> "" Then
    ' 最後の記録行を更新
    Do While sh10.Cells(lastRow + mRow + 1, "F").Value <> ""
    lastRow = lastRow + 1
    Loop
    lastRow = lastRow + 1
    sh10.Cells(lastRow + mRow, "F").Value = sh1.Cells(7, "C").Value '名前
    sh10.Cells(lastRow + mRow, "K").Value = sh1.Cells(18, "M").Value '枚数

      補足日時:2023/07/10 19:43
  • sh10.Cells(lastRow + mRow, "E").Value = sh1.Cells(7, "N").Value '日
    sh10.Cells(lastRow + mRow, "D").Value = sh1.Cells(7, "M").Value '月
    sh10.Cells(lastRow + mRow, "G").Value = sh1.Cells(2, "Q").Value '伝票番号
    End If
    If sh1.Cells(Row, "K").Value = "0" Then
    sh10.Cells(Row + mRow, "F").EntireRow.Delete
    End If
    End Sub
    以上です。(本文の方に書き込めませんでした。)

      補足日時:2023/07/10 19:45

A 回答 (5件)

こんにちは


示されている処理コードとイメージが合わないのですが・・・
>現在の不具合は“0”の場合に該当する帳簿の行が空白行となり、次の伝票番号で入力シートに数値が入った場合、

>該当するのですが空白行の下の行に記録されます。

0の場合何もせずに上から空白行を見つければ空白行は発生しないはず

ご質問のコードで合っていそうですが
mRow=0はあり得る?  + 1 は必要ですか 
 
また 伝票番号はFではなくG列です
前処理で名前が先に入るなんて事は無いですかね 
エリアで上から詰めて入力するのなら 
mRowはエリアの初めの行(見出し行など)

lastRow = sh10.Cells(mRow, "G").End(xlDown).Row + 1
sh10.Cells(lastRow, "F").Value = sh1.Cells(7, "C").Value '名前
sh10.Cells(lastRow, "K").Value = sh1.Cells(18, "M").Value '枚数
sh10.Cells(lastRow, "E").Value = sh1.Cells(7, "N").Value '日
sh10.Cells(lastRow, "D").Value = sh1.Cells(7, "M").Value '月
sh10.Cells(lastRow, "G").Value = sh1.Cells(2, "Q").Value '伝票番号

又は

Do While sh10.Cells(lastRow + mRow + 1, "G").Value <> ""
lastRow = lastRow + 1
Loop
lastRow = lastRow + 1


なのでは・・・
    • good
    • 0
この回答へのお礼

ありがとう

いつも、ご教授いただき有難うございます。汎用性のないVBAでの事務処理の自動化の一連の流れの中で、最後の帳簿への記帳コードを教えていただきながら試行錯誤で、やっとここまできました。ご提示いただいたコード等を参考に完成させたいと思います。作業にしばらくかかりそうなので一旦質問を中止させていただきます。

お礼日時:2023/07/12 22:06

閉じてトライする件、分かりました 



コードの処理自体は単純な流れであるような気がしますが 変数の取得値があっているのかなどは 表組みが分からないのでコードだけでは良く解りません

ステップ実行やイミディエイトウィンドウへの出力、 状況によっては
ローカルウィンドウなどを使い、処理途中の変数の値を確認しながら
処理を追って行くと 原因の特定や処理手順の不具合など
改善方法をつかめるかも知れません
健闘を祈ります 頑張ってください
    • good
    • 0
この回答へのお礼

有難うございます。また、見かけましたら宜しくお願いいたします。

お礼日時:2023/07/13 05:37

14を10に変え 質問文を読み直しました



sh10の 2~30行のA帳簿

B帳簿のシートと範囲は?

>該当する
該当とはどのような事を指しますか?

sh10の表組みイメージが良く解りません
    • good
    • 0
この回答へのお礼

遅い時間まで、ご対応いただき有難うございます。
>sh10の 2~30行のA帳簿
sh10シートには、4月~翌年3月までの1年間の月ごとの受払帳を同じ列に作成しています。1行目は「繰越」行のため2行目から30行を転記行としています。
>B帳簿のシートと範囲は?
商品券の種類により、A,B,C,Dの帳簿のシートを作成しています。各シートの表は全く同じで、種類は枚数セルのM18はA,M23はB,M27はC,M31はCへと転記するようにしています。
>該当する
該当とはどのような事を指しますか?
sh1に入力された4種類の内、「枚数」セルに入力された種類がA,B,C,Dのどの種類の帳簿に該当するかを指しています。現在の不具合は“0”の場合に該当する帳簿の行が空白行となり、次の伝票番号で入力シートに数値が入った場合、該当するのですが空白行の下の行に記録されます。
>sh10の表組みイメージが良く解りません
画像の添付ができませんが、前期の>sh10の2~30行のA帳簿と次の質問の内容でご了承いただけたら幸いです。

お礼日時:2023/07/12 09:07

一応、整理したコードです


Public Sub Giftbook_main(mRow As Long)
Dim sh10 As Worksheet
Dim sh1 As Worksheet
Dim sh9 As Worksheet

Dim lastRow As Long '最後の記録行を追跡する変数
Set sh10 = Worksheets("A商品券受払帳")
Set sh1 = Worksheets("入力シート")
Set sh9 = Worksheets("振替伝票①")

Dim Rng As Range, slip_number As Range
Dim numRow As Long

Set Rng = sh10.Range("A2", sh10.Cells(Rows.Count, "A").End(xlUp))
'売上伝票番号sh1.Cells(2, "Q").Valueの値をsh10A列範囲内で探す
Set slip_number = Rng.Find(What:=sh1.Cells(2, "Q").Value, LookIn:=xlValues, LookAt:=xlWhole)
If slip_number Is Nothing Then
'無ければ
MsgBox ("売上伝票番号=" & sh1.Cells(2, "Q").Value & "は入力シートにありません")
Exit Sub
Else
'有れば見つけた売上伝票番号の行番号を変数に代入
numRow = slip_number.Row
End If

If sh1.Cells(18, "M").Value = "" Then
MsgBox ("枚数が未表示です")
Exit Sub
End If
If sh1.Cells(7, "L").Value = "" Then
MsgBox ("年が未表示です")
ElseIf sh1.Cells(7, "L").Value > 2 Then
sh10.Cells(7, "D").Value = sh1.Cells(7, "L").Value
Else
Exit Sub
End If
'下記の処理は不明のまま
If sh1.Cells(18, "M").Value = "0" Then
'0の時 行を削除
sh10.Cells(numRow + mRow, "F").EntireRow.Delete
Else
'見つけた売上伝票番号行に纏わる処理
sh10.Cells(numRow + mRow, "F").Value = sh1.Cells(7, "C").Value '名前
sh10.Cells(numRow + mRow, "K").Value = sh1.Cells(18, "M").Value '枚数
sh10.Cells(numRow + mRow, "E").Value = sh1.Cells(7, "N").Value '日
sh10.Cells(numRow + mRow, "D").Value = sh1.Cells(7, "M").Value '月
sh10.Cells(numRow + mRow, "G").Value = sh1.Cells(2, "Q").Value '伝票番号

' 最後の記録行を更新
lastRow = sh10.Cells(mRow, "F").End(xlUp).Row + 1
sh10.Cells(lastRow + mRow, "F").Value = sh1.Cells(7, "C").Value '名前
sh10.Cells(lastRow + mRow, "K").Value = sh1.Cells(18, "M").Value '枚数
sh10.Cells(lastRow + mRow, "E").Value = sh1.Cells(7, "N").Value '日
sh10.Cells(lastRow + mRow, "D").Value = sh1.Cells(7, "M").Value '月
sh10.Cells(lastRow + mRow, "G").Value = sh1.Cells(2, "Q").Value '伝票番号
End If

End Sub
    • good
    • 0

こんばんは


セキュリティによるものか 文字列とコードを交互に書くと投稿出来ないようです
説明文にある
>Sh14の行
コード内にSh14を示す処理が見当たりませんね

処理条件を精査して 
売上伝票番号があればその範囲(mRow)の行
無ければ最終行?なのか?空白行?
特定条件なら行を削除
みたいに整理してみるのが良さそう・・

行の取得や変数名Rowの見直しをすると分かり易くなるかも・・
別の方に色々書いてみますね
    • good
    • 0
この回答へのお礼

有難うございます。入力ミスがありすみません。
sh14ではなくsh10の間違いです。sh9は関係ありません。いろいろやってみたのですが、どうしても空白行が記録されているようで、空白番号を含めた行に表示されてしまいます。私の能力では解決できません。

お礼日時:2023/07/11 22:29

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