[[20250502103242]] 『Delete後のセル範囲について』(ささみ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『Delete後のセル範囲について』(ささみ)

特定のセル範囲をDeleteした後にUsedRangeで範囲を確認すると
ゴミが残っているのかDeleteしたはずの範囲を含んでしまいます
一応セル範囲.Formula=セル範囲.Formulaと上書き保存とClearも試しましたが
変わらずの状態です
他に対処法があれば教えていただけますか?

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


Excel 2016 Win10
ですが。。。再現しません 
乱暴ですが シート丸ごと削除、作り直しでは^^;
そこまでせずとも
UsedRange を Delete でも ダメなのでしょうか

(隠居Z) 2025/05/02(金) 11:01:26


Option Explicit
Sub OneInstanceMain()
    Dim i As Long
    Dim v
    DEntry
    With Worksheets("Sheet1")
        .UsedRange.Delete
        MsgBox .UsedRange.Address
    End With
End Sub
Private Sub DEntry()
    With Worksheets("Sheet1")
        .Range("A1:D11").Value = "EXCEL"
        MsgBox .UsedRange.Address
    End With
End Sub
↑ だと どうなりますでせうか?
m(__)m
(隠居Z) 2025/05/02(金) 11:03:58

 削除したいのはUsedRange全てではないので丸ごとDeleteは望ましくないんですよね…

 対象シートはデータ表なのですが、印刷もするので1ページ25行×6列の表として
 ページごと追加・削除を行おうとしています
 動作確認で2ページ目(A26:F50)に罫線など表の形式を反映させてから2ページ目を
 Deleteした後UsedRangeの行数を確認したら50行になっていたんです
(ささみ) 2025/05/02(金) 11:29:48

 With ActiveWorkbook.Worksheets.Add
  .Range("A1:G16").Borders.LineStyle = True
  .Range("B1:F16").Delete Shift:=xlUp
  MsgBox .UsedRange.Address
 End With

こんなことが起きているのではと予想
(豆右衛門) 2025/05/02(金) 11:49:47


 Range("A26:F50")のデータは削除(Delete)したけど、罫線は残っているってこと?
 だとすれば、UsedRangeはそのままですよ。
 罫線や書式設定なども、ユーザが使用している(Used)ってことになるので。
(ん?) 2025/05/02(金) 12:00:25

 >豆右衛門さん
 行数と列数はModule先頭に定数で宣言して利用しているので削除範囲が
 ずれることはないと思うんです
 改ページプレビュー上だとちゃんと1ページのみ(A1:F25)にはなっているのですよね…

 >ん?さん
 罫線も削除されています
(ささみ) 2025/05/02(金) 12:03:08

なるほど、なるほど (*^^*) そうかもしれませんですね。
ほんの、一例ですが
1.データはデータで作成保管(分割含む)
2.必要な帳票作成、印刷、等々は1.を読み込んで別途作成、処理
とかにすれば、運用が楽になるかもしれませんですね。。。と! 私
は思います。でわ
m(__)m

(隠居Z) 2025/05/02(金) 12:07:00


 >特定のセル範囲をDeleteした後にUsedRangeで範囲を確認すると
 >ゴミが残っているのかDeleteしたはずの範囲を含んでしまいます
 >一応セル範囲.Formula=セル範囲.Formulaと上書き保存とClearも試しましたが
 >変わらずの状態です 

 言葉で言ってないで、
 (そちらでトラブルになる)再現コードを提示してもらえませんか?

(半平太) 2025/05/02(金) 12:12:33


 >半平太さん
 失礼しました

 *下記コード中のWSはActivesheetです

 Public Const ColCnt As Long = 6
 Public Const RowCnt As Long = 25

 Sub Delete_Page(ByVal WS As Worksheet)

    With WS
        Dim PageCnt As Long
        PageCnt = WorksheetFunction.RoundUp(.UsedRange.Rows.Count / RowCnt, 0)

        If PageCnt = 1 Then Exit Sub

        Dim startRow As Long
        startRow = RowCnt * (PageCnt - 1) + 1

        .Cells(startRow, 1).Resize(RowCnt, ColCnt).Delete

        If .Shapes.Count > 0 Then
            Dim shp As Shape
            For Each shp In .Shapes
                If shp.Top > .Cells(startRow, 1).Top Then shp.Delete
            Next shp
        End If

        If .HPageBreaks.Count > PageCnt - 1 Then
            .HPageBreaks(.HPageBreaks.Count).Delete
        End If

        If .Cells(startRow - 1, 1).Resize(1, ColCnt).Borders(xlEdgeBottom).LineStyle <> xlContinuous Then
            .Cells(startRow - 1, 1).Resize(1, ColCnt).Borders(xlEdgeBottom).LineStyle = xlContinuous
        End If

        Application.Goto reference:=.Cells(startRow - RowCnt, 1), Scroll:=True

    End With

 End Sub

 念のため、ページ追加のコードも追記します

 Sub Add_Page(ByVal WS As Worksheet)

    With WS
        Dim PageCnt As Long, startRow As Long
        PageCnt = WorksheetFunction.RoundUp(.UsedRange.Rows.Count / RowCnt, 0)
        startRow = RowCnt * PageCnt + 1
        If .HPageBreaks.Count < PageCnt Then .HPageBreaks.Add .Cells(startRow, 1).Resize(1, ColCnt)

        Dim タイトルRange As Range
        Set タイトルRange = Set_タイトルRange(WS,1)

        .Cells(startRow, 1).Resize(タイトルRange.Item(タイトルRange.Count).Row, ColCnt).Value(xlRangeValueXMLSpreadsheet) _
            = Range(.Cells(1, 1), タイトルRange.Item(タイトルRange.Count)).Value(xlRangeValueXMLSpreadsheet)

        Dim varRow As Variant
        varRow = Application.Match("預り金", ThisWorkbook.Worksheets(1).Columns(1), 0)
        If IsError(varRow) Then varRow = 6

        Dim bufRow As Long
        bufRow = startRow + タイトルRange.Item(タイトルRange.Count).Row

        .Cells(bufRow, 1).Resize(7, ColCnt).Value(xlRangeValueXMLSpreadsheet) _
            = ThisWorkbook.Worksheets(1).Cells(varRow, 1).Resize(7, ColCnt).Value(xlRangeValueXMLSpreadsheet)

        Call Set_形式Format(WS, PageCnt + 1)

        Application.Goto reference:=.Cells(startRow, 1), Scroll:=True
    End With

 End Sub

(ささみ) 2025/05/02(金) 12:40:22


 Sub Delete_Page(ByVal WS As Worksheet) のコードにおいてですが、
 どこで、Delete後のUsedRangeを使っている(確認している)のですか?

 もしくは、

 Deleteしたはずの範囲が含まれていることについて、何を以て確認できたのですか?
 ※Delete前の最終行番号と
  Delete後の最終行番号を書き出すコードを追加してみれば
  ささみさんの主張が正しいかどうか誰にも明らかになると思いますけども。

(半平太) 2025/05/02(金) 13:47:58


 Dim msg As String
 Dim s As Shape
 For Each s In ActiveSheet.Shapes
  If s.BottomRightCell.Column > 6 Then
   msg = msg & s.Name & " :BottomRightAddress 【" & s.BottomRightCell.Address(0, 0) & "】" & vbCrLf
  End If
 Next
 MsgBox msg

これで何か見つかるかも?
(豆右衛門) 2025/05/02(金) 13:58:50


 自己解決?しました
 新規Sheetで改めて表を作り直し、上記のページ追加・削除ののちに
 表形式を整えるSub(上記Add_Page内記載のSet_形式Format)を行ったところ
 UsedRangeの範囲が望んだものになりました
 試していたSheetに何らかの問題があったようです
 結局原因が不明なのでいまいちスッキリしませんがとりあえず解決したと考えます

 >半平太さん
 Delete_Pageを行った後で再度Add_Pageを行ったらエラーが出たので
 そこでちゃんと削除されていないことが分かりました
 その後Delete_Pageを試すたびにDebug.Printでセル範囲を確認していたのですが
 どうにも変わらなかったのでこちらに相談することにしました

 >豆右衛門さん
 問題のSheetで試してみましたが何も出ませんでした…

(ささみ) 2025/05/02(金) 14:07:20


コメント返信:

[ 一覧(最新更新順) ]


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