[[20150225205047]] 『マクロが動作が不安定』(nobu) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロが動作が不安定』(nobu)

web上で探した現金出納帳を改良し、利用しています。
(フリーのシンプルExcel現金出納帳です。)

原版はA〜F列では(6列)
日付  科目  摘要   入金   出金   残高
以下の用に列を増やし利用(A〜I列)(9列)
日付  科目  摘要   内訳   担当  区分  入金   出金  残高
3行目まで見出し行
4行目繰越残高(前月から今月データへ転記)
以下コードにて利用中なのですが繰越(SheetCopy)を実行した時に
前月からの繰越金が転記されない場合があります。
文中にMacro1がありますが、最終行(最終行は月により違います)から下を
一度削除すると不思議に
コードがうまく動作し、転記も可能となります。

識者の方のご指導を頂きたいのですが、何卒よろしくお願いします。

Sub delete_Click()

    Dim wGyou As Long
    Dim wLastGyou As Long
    Dim wSheetName As Variant

    'アクティブなシート名を取得
    wSheetName = ActiveSheet.Name

    'アクティブなセルの行番号を取得
    wGyou = ActiveCell.Row

    '最終行番号を取得
    wLastGyou = Worksheets(wSheetName).UsedRange.Rows.Count

    '繰り越し(4行)より上の行または合計欄の行削除は実行しない。
    If wGyou <= 4 Or wGyou = wLastGyou Then Exit Sub

    '行を削除する
    Range(wGyou & ":" & wGyou).Delete

 End Sub

Sub insert_Click()

    Dim wGyou As Long

    'アクティブなセルの行番号を取得
    wGyou = ActiveCell.Row

    '繰り越し(4行目)より上の行には挿入処理を行わない。
    If wGyou < 4 Then Exit Sub

    '事前にコピーや切取りの操作を取り消す
    Application.CutCopyMode = False

    '行を追加
    Range(wGyou + 1 & ":" & wGyou + 1).Select
    Selection.EntireRow.Insert

    '数式をコピーする
    Range("I" & wGyou).Copy
    Range("I" & wGyou + 1).PasteSpecial Paste:=xlPasteFormulas

    'コピーを取り消す
    Application.CutCopyMode = False

    'セルの位置を移動
    Range("A" & wGyou + 1).Select

End Sub

Sub orderby_Click()

    Dim wLastGyou As Long
    Dim wSheetName As Variant
    Dim i As Long

    'アクティブなシート名を取得
    wSheetName = ActiveSheet.Name

    '最終行番号を取得
    wLastGyou = Worksheets(wSheetName).UsedRange.Rows.Count

    '並べ替えを実行する
    Range("A5:I" & wLastGyou - 1).Sort _
        Key1:=Range("A5"), _
        Order1:=xlAscending, _
        Header:=xlNo

    '残高の計算式を再セットする
    For i = 5 To wLastGyou - 1  '5行目から最終行(合計欄)の1行上まで指定
        Range("I" & i).Formula = _
            "=IF(OR(G" & i & "<>" & Chr(34) & Chr(34) & ",H" & i & "<>" & Chr(34) & Chr(34) & "),$I$4 +SUM($G$5" & ":G" & i & ")-SUM($H$5" & ":H" & i & ")," & Chr(34) & Chr(34) & ")"
    Next i

End Sub

Sub SheetCopy()

    Dim wLastGyou As Long
    Dim wSheetName As Variant
    Dim i As Variant
    Dim wMaxDay As Variant
    Dim wNextMonth As Variant
    Dim wNewSheetName As Variant
    Dim wKurikoshi As Long

Call Macro1

    'アクティブなシート名を取得
    wSheetName = ActiveSheet.Name

    '最終行番号を取得
    wLastGyou = Worksheets(wSheetName).UsedRange.Rows.Count

    '繰り越し金額を取得
    wKurikoshi = Range("I" & wLastGyou).Value

    '最後の日付を取得(並び替えしていない場合も想定)
    For Each i In Range("A5:A" & wLastGyou - 1)
        If wMaxDay < i Then wMaxDay = i
    Next

    '取得した最終日から年月を抽出
    If IsDate(wMaxDay) Then
        wNextMonth = DateSerial(DatePart("yyyy", wMaxDay), DatePart("m", wMaxDay) + 2, 0)
        wNewSheetName = DatePart("yyyy", wNextMonth) & "年" _
                & DatePart("m", wNextMonth) & "月"
    Else
        MsgBox "日付が入力されていないので処理を終了します", _
                vbOKOnly + vbExclamation, "エラー"
        Exit Sub
    End If

    '[出納帳]シートをコピーする
    Sheets(wSheetName).Copy After:=Sheets(wSheetName)

    'コピーしたシート名を変更する
    ActiveSheet.Name = wNewSheetName

    '繰り越し金額を設定する
    Range("I4").Value = wKurikoshi

    'A5からE列最終行まで入力された文字をクリアする
    Range("A5:H" & wLastGyou - 1).ClearContents
    Range("J5:K" & wLastGyou - 1).ClearContents
    Range("A1").Value = DateAdd("m", 0, wNextMonth)
End Sub

Sub Macro1()

    Rows("76:700").Select
    Selection.Delete Shift:=xlUp

End Sub

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 私自身、回答案をアップする際に、「手を抜いて」UsedRangeを使った処理を提示したりしますが
 UsedRangeは、
 ・ケースによっては【まぎれ】が少なくなく、現在空白の場所もUsedRangeに含まれることがある。
 ・対象領域だと思っている領域の外、ずっと、下のほう、あるいはずっと右のほうのセルに何か(ゴミも含めて)入っていると
  そこまでがUsedRangeに含まれてしまう。

 UsedRangeには、こういう、あぶなっかしさがあります。

 wLastGyou = Worksheets(wSheetName).UsedRange.Rows.Count

 これを

 wLastGyou = Worksheets(wSheetName).Range("A" & Rows.Count).End(xlUp).Row

 に変更して試してみるとどうなるでしょうか?

 これでも、同じように【不安定】だとすれば、本当に、A列の最終行の下に、なにか目に見えないゴミが
 存在するということになります。その場合は、ゴミが残る原因を徹底的に追及しなければいけませんが。

(β) 2015/02/25(水) 21:23


βさん
速攻ありがとうございます。
改善しました(すごいです本日半日格闘したのに・・・) が
最終行の一行のみ残ってしまいます。
> 'A5からE列最終行まで入力された文字をクリアする
  ↑でクリアしていると思うのですが不思議です。
それとB4に 繰越残高 タイトルがあるのですが
これは、消えてしまいました
お解りのなるようであれば、教授ください。
よろしくお願いします。
(nobu) 2015/02/25(水) 21:41

 コード全体はまだ精読していませんが、

 「最終行の一行のみ残ってしまいます。」や「B4に 繰越残高 タイトルがあるのですが これは、消えてしまいました 」

 これは、どのマクロを実行した時にそうなるんですか?

 それと、Macro1 以外に4つのプロシジャがありますが、それぞれ、何をどのように処理する意図なのか
 具体的に説明いただけませんか。
 (ついでに、Macro1の必要性についても)

 また、コード内で、ActiveSheet や ActiveCell が登場しますが、各マクロ実行前に、シートやセルを
 操作者が選択するんでしょうけど、何を選択するんですか? また、その意図は?

(β) 2015/02/26(木) 09:42


'A5からE列最終行まで入力された文字をクリアする
Range("A5:H" & wLastGyou - 1).ClearContents
 Range("J5:K" & wLastGyou - 1).ClearContents

この部分で最終行から1行引いた行数をクリアしてということになっています。
最終行は合計欄ということですがそれが残るということです。

'A5からE列最終行まで入力された文字をクリアする
となっていますが実際にはF列からH列 JからK列も削除します

(デイト) 2015/02/26(木) 10:03


βさん
デイトさん
ありがとうございました。
何とかアドバイスを元に解決いたしました。

(nobu) 2015/02/27(金) 12:57


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.