EXCELで画像やシェイプを含めた使用範囲を取得したい

[戻る]
ぽこ 2008/07/25(金) 19:54:04
初心者のため、分かりづらいかもしれませんがすみません。
EXCELでVBで、使用範囲を取得したいです。

    LastC = Range("A1:AA100").SpecialCells(xlCellTypeLastCell).Column
    LastR = Range("A1:AA100").SpecialCells(xlCellTypeLastCell).Row

とやったところ、セルに直接入力している部分の最後のセルは取れたのですが、画像や
シェープやグラフなどが入ったセルも含めた使用している範囲を知りたいのですが、そ
の方法がわかりません。またRange("A1:AA100")というのもできれば、シート内全部の中
にしたいので、AA100とか調べる範囲の制限をつけたくないです。
どうしたらよろしいかご教授いただけたらと思います。
よろしくお願いします。

Blue 2008/07/28(月) 11:30:35
図形用のものはないようですね。
すべてのShapes(DrawingObjects)をループして、TopLeftCell、BottomRightCellを見て
いくんでしょうかね。

sample)
Sub test()
    Dim r As Range
    
    Set r = GetDrawingObjectUsedRange
    If Not r Is Nothing Then
        ' セルを選択
        r.Select
    End If
End Sub

' 図形の使用しているRangeを取得
Private Function GetDrawingObjectUsedRange() As Range
    Dim o As Object
    Dim r As Range
    Dim tl As Range
    Dim br As Range
    
    For Each o In ActiveSheet.DrawingObjects
        ' 常に図形の最左上を指定するようにする
        Set r = o.TopLeftCell
        If tl Is Nothing Then
            Set tl = r
        ElseIf tl.Row > r.Row And tl.Column > r.Column Then
            Set tl = r
        ElseIf tl.Row > r.Row Then
            Set tl = tl.Offset(r.Row - tl.Row)
        ElseIf tl.Column > r.Column Then
            Set tl = tl.Offset(, r.Column - tl.Column)
        End If
        
        ' 常に図形の最右下を指定するようにする
        Set r = o.BottomRightCell
        If br Is Nothing Then
            Set br = r
        ElseIf br.Row < r.Row And br.Column < r.Column Then
            Set br = r
        ElseIf br.Row < r.Row Then
            Set br = br.Offset(r.Row - br.Row)
        ElseIf br.Column < r.Column Then
            Set br = br.Offset(, r.Column - br.Column)
        End If
    Next
    
    If Not tl Is Nothing And Not br Is Nothing Then
        Set GetDrawingObjectUsedRange = ActiveSheet.Range(tl, br)
    End If
End Function

ぽこ 2008/07/28(月) 15:48:54
[[解決]]
大変ありがとうございました!!おかげで解決できました。
質問には書きませんでしたが、最右下がObjectか値が入力されているセルになるかわか
らないのと先頭(最左上)位置はいつも、A1セルにしたかったので、「' 常に図形の最
左上を指定するようにする」の部分を省略し、For文の前に下の二行を入れました。

    Set tl = Range("A1") '最左上を指定
    Set br = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell) '使用範囲(除く
図形)の右下セット

これによって、最左上を常にA1、そして、最右下がObjectでなくても選択できるように
なりました。

古いスレッドには追加発言できません。