エクセル(2003)VBAでつくるマクロに関する質問です。


選択したセルの罫線以外の書式をクリア(初期設定に戻す)マクロを組みたいのですが、
どうすればいいでしょうか。
ただし、できる限り汎用性をもたせ、かつ高速にしたいのです。
VBA勉強中のため、できるだけ色々な方法を知りたいと思っています。

1つ思いついたのは、xlPasteAllExceptBordersを使う方法。
例えば、空白の可能性の高いセル(A65536など)をコピーして、
xlPasteAllExceptBordersで貼り付ける。

どうぞよろしくお願いします。



参考までに動かなかったマクロです。

sub 書式クリア()
Dim セル As Range

For Each セル In Selection
Selection.Font.Bold.Clear
Selection.Font.Color.Clear
Selection.Font.ColorIndex.Clear
Selection.Font.Size.Clear
Selection.Font.Italic.Clear
Selection.Font.Underline.Clear
Selection.Interior.Color.Clear
Selection.Interior.ColorIndex.Clear
Selection.Interior.Pattern.Clear

Next セル

end sub

「オブジェクトが必要です」と出てきてしまいました。clearメッソッドは、プロパティに対しては実行できないようです。

回答の条件
  • 1人5回まで
  • 登録:2008/07/27 11:35:39
  • 終了:2008/07/29 00:02:42

ベストアンサー

id:n_kusano No.3

n_kusano回答回数48ベストアンサー獲得回数12008/07/27 18:52:25

ポイント50pt

対象セルを他のシートにコピーしクリアしたのち、コピーしたセルの罫線プロパティを対象セルに設定しなおす方法はどうですか?

対象セルを引数にしています

Public Sub clearCell(targetCell As Range)

    Dim copyCell As Range
    Dim direction As Variant
 
'コピー先を決めます  
    Set copyCell = Worksheets("Sheet2").Range(targetCell.Address)

'XlBordersIndexクラス定数を配列にします
    If targetCell.Cells.Count = 1 Then
        direction = Array(xlDiagonalDown, xlDiagonalUp, xlEdgeBottom, xlEdgeLeft, xlEdgeRight, xlEdgeTop)
    Else
        direction = Array(xlDiagonalDown, xlDiagonalUp, xlEdgeBottom, xlEdgeLeft, xlEdgeRight, xlEdgeTop, xlInsideHorizontal, xlInsideVertical)
    End If

'コピーしたあとクリアします
    targetCell.Copy copyCell
    targetCell.Clear

'コピーしたセルの罫線プロパティのみ対象セルに代入します
    For i = 0 To UBound(direction)
        With targetCell.Borders(direction(i))
            If Not copyCell.Borders(direction(i)).LineStyle = xlLineStyleNone Then
                .LineStyle = copyCell.Borders(direction(i)).LineStyle
                .Weight = copyCell.Borders(direction(i)).Weight
                .Color = copyCell.Borders(direction(i)).Color
            End If
        End With
    Next i

'コピーしたセルをクリアします
    copyCell.Clear

End Sub

id:tomokazu0525

ありがとうございます。

やはり高速という点では疑問符がつきますが、とても勉強になりました。

2008/07/28 00:29:14

その他の回答(2件)

id:SALINGER No.1

SALINGER回答回数3454ベストアンサー獲得回数9692008/07/27 12:00:10

ポイント30pt

動かなかったマクロをそのまま修正すると

Sub 書式クリア()
    Dim セル As Range
    
    For Each セル In Selection
        セル.Font.Bold = False
        セル.Font.ColorIndex = 0
        セル.Font.Size = 11
        セル.Font.Italic = False
        セル.Font.Underline = False
        セル.Interior.ColorIndex = xlNone
        セル.Interior.Pattern = xlPatternNone
    Next

プロパティに適正な値を代入しないといけないです。


セルA65536をコピーする方法だと

Sub 書式クリア()
    Dim セル As Range
    
    Range("A65536").Copy
    For Each セル In Selection
        セル.PasteSpecial Paste:=xlPasteAllExceptBorders
    Next
End Sub
id:tomokazu0525

早速の返信ありがとうございます。

具体的な値を入れないといけないのですね。。。

ところで、colorが削除され、ColorIndexのみが残っていますが、

ColorIndexとcolorは、どちらか片方だけでいいということなのでしょうか?

2008/07/27 13:47:19
id:SALINGER No.2

SALINGER回答回数3454ベストアンサー獲得回数9692008/07/27 14:00:41

ポイント20pt

http://www.big.or.jp/~seto/vbaref/vbaref4.htm

ColorとColorIndexは両方とも色を指定するプロパティ。

ColorIndexは番号で、Colorは16進数でより細かい色指定ができます。


因みに上の例だとまだまだ残る書式があります。例えば

フォント名、表示形式、文字位置、セルの結合、折り返し・・・。

id:tomokazu0525

書式に関わるプロパティって、大量にあるんですね。

そんなに書くと高速という点の実現が難しそうなので、やめておきます。

ありがとうございます。

2008/07/27 14:19:33
id:n_kusano No.3

n_kusano回答回数48ベストアンサー獲得回数12008/07/27 18:52:25ここでベストアンサー

ポイント50pt

対象セルを他のシートにコピーしクリアしたのち、コピーしたセルの罫線プロパティを対象セルに設定しなおす方法はどうですか?

対象セルを引数にしています

Public Sub clearCell(targetCell As Range)

    Dim copyCell As Range
    Dim direction As Variant
 
'コピー先を決めます  
    Set copyCell = Worksheets("Sheet2").Range(targetCell.Address)

'XlBordersIndexクラス定数を配列にします
    If targetCell.Cells.Count = 1 Then
        direction = Array(xlDiagonalDown, xlDiagonalUp, xlEdgeBottom, xlEdgeLeft, xlEdgeRight, xlEdgeTop)
    Else
        direction = Array(xlDiagonalDown, xlDiagonalUp, xlEdgeBottom, xlEdgeLeft, xlEdgeRight, xlEdgeTop, xlInsideHorizontal, xlInsideVertical)
    End If

'コピーしたあとクリアします
    targetCell.Copy copyCell
    targetCell.Clear

'コピーしたセルの罫線プロパティのみ対象セルに代入します
    For i = 0 To UBound(direction)
        With targetCell.Borders(direction(i))
            If Not copyCell.Borders(direction(i)).LineStyle = xlLineStyleNone Then
                .LineStyle = copyCell.Borders(direction(i)).LineStyle
                .Weight = copyCell.Borders(direction(i)).Weight
                .Color = copyCell.Borders(direction(i)).Color
            End If
        End With
    Next i

'コピーしたセルをクリアします
    copyCell.Clear

End Sub

id:tomokazu0525

ありがとうございます。

やはり高速という点では疑問符がつきますが、とても勉強になりました。

2008/07/28 00:29:14
  • id:SALINGER
    3の回答でおおむねいいかなと思ったのですが、実はうまくいかない場合がある。
    対象のセルの上下や左右のセルで罫線を設定した場合、対象セルには見た目罫線があるにもかかわらず
    実際は無くて、コピーしたときに罫線はコピーされないというおかしなことになります。
  • id:n_kusano
    3の回答者です。イルカ有難うございます。
    コメント拝見しました。参考になるかわかりませんが、情報追加します。

    XlBordersIndexクラス定数には
    xlDiagonalDown, xlDiagonalUp, xlEdgeBottom, xlEdgeLeft, xlEdgeRight, xlEdgeTop, xlInsideHorizontal, xlInsideVertical
    のほかに
    xlBottom, xlLeft, xlRight, xlTop
    という定数があります。隣接するセルの罫線を含める場合は上記4つの定数を使うとうまくいくかもしれません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません