dポイントプレゼントキャンペーン実施中!

お世話になっております。

業務上必要になり(効率化が図れるので)選択したセルにバツの罫線を引くマクロを作成しています。
まだまだ自分のレベルが低いので、マクロ記録を参考に、下記のようなマクロを作りました。

Sub バツ罫線マクロ()
 ActiveCell.Select
  With Selection.Borders(xlDiagonalDown)
    .LineStyle = xlContinuous
    .Weight = xlHairline
    .ColorIndex = xlAutomatic
  End With
  With Selection.Borders(xlDiagonalUp)
    .LineStyle = xlContinuous
    .Weight = xlHairline
    .ColorIndex = xlAutomatic
  End With
End Sub

試してみると、選択したセルに対してバツの罫線が引かれました。
やった!と思ったのもつかの間、Ctrlキーでセルを複数選択してマクロを実行すると最後にアクティブにしたセルしか罫線が引かれないではありませんか・・・。

ネットなどで調べてみると、Ctrlキーで複数選択してもアクティブセルというのはそのうちの一つだけというような記述がありました・・・。
そして、ここで行き詰ってしまいました。

お伺いしたいのは2つあります。

・どうすればCtrlキーで選択した全てのセルにこの罫線を引くマクロを適用させる事が出来ますか?

・変数などを用いたもっとレベルの高いコードの書き方だと、どのように記述されますか?後学のためにレベルの高い人の記述方法と比較させてもらって勉強させてもらいたいと思っています。

よろしくお願いします。

A 回答 (15件中11~15件)

こんばんは


天邪鬼なんでひねくれた答えですいませんが、こういう方法もあります。
要するにこの目的を達成するのにいちいちマクロ使いますか?ということです。

Excelのバージョンにもよりますが、ツールバーに斜め罫線を左上がり、右上がりとも追加しておいて、セルを選択してからそれを順次2つとも押す。

ちなみにご存知かと思いますが、ツールバーにボタンを追加するには、
・ツールバーの開いているところを右クリック-「ユーザー選択」
・ダイアログが出てきますので、「コマンド」タブを選択し、分類は「書式」を選ぶと下のほうにいろいろな罫線のボタンが出てくるので、斜め罫線をツールバーの任意の場所にドロップ
です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ご指摘の通りとは思いますが、2つの点でマクロを作った方が良いと判断しました。

1つ目は、VBAとかマクロの勉強になるからという理由です。もちろん何でもかんでもマクロにすればいいってものではないという事も学習せねばなりませんが・・・。
その意味では回答者様に指摘いただいたことは今後気をつけていこうと思います。

2つ目は実際に行う場合の業務効率の問題です。
Excelのシートを上から下にどんどんスクロールさせて該当箇所を指定してバツ罫線を入れていく作業を考えると、
 ・ボタンのある所までマウスを動かし
 ・2つもボタンを押す
というのは、マクロをショートカットキー登録して作業する事に比較するといかにも業務効率が落ちると考えます。
以上の2点から、マクロを使った方法を模索し、(えらく初歩的な段階で)行き詰まり、こうして質問した次第です。説明不足でした。

お礼日時:2005/10/21 15:09

こんにちは。

KenKen_SP です。

Areas コレクション内を For Each でループさせた方法です。
選択範囲のブロック毎にまとめて書いた方が早いと思います
が、どうでしょうか?

ご参考までに。

Sub Sample()
  
  Dim rngArea As Range
  Dim i    As Integer
  
  Application.ScreenUpdating = False
  For Each rngArea In Selection.Areas
    'xlDiagonalDown = 5
    'xlDiagonalUp  = 6
    For i = 5 To 6
      With rngArea.Borders(i)
        .LineStyle = xlContinuous
        .Weight = xlHairline
        .ColorIndex = 1
      End With
    Next i
  Next rngArea
  Application.ScreenUpdating = True

End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
色々な方法を教えていただいて、締め切る際にどの方にポイントをつければいいのかと迷い始めています~。

色々なやり方ありますが、たくさんのデータのあるファイル(実際のデータはかなり重いです)で使用し続けると速度の違いとか明確になるかもしれませんね。
来週の週明けから早速試しまくって見ます。

お礼日時:2005/10/21 14:54

複数のセルに同じ作業をするときは


絶対にunionを使いましょう。
選ぶ数が多いほど格段にスピードが違います。

Dim allcell
For Each c In Selection.Cells
If Not IsObject(allcell) Then
Set allcell = c
Else
Set allcell = Union(allcell, c)
End If
Next

With allcell.Borders(xlDiagonalDown)
.LineStyle = xlContinuous
.Weight = xlHairline
.ColorIndex = xlAutomatic
End With
With allcell.Borders(xlDiagonalUp)
.LineStyle = xlContinuous
.Weight = xlHairline
.ColorIndex = xlAutomatic
End With
    • good
    • 0
この回答へのお礼

うわ~、起床してみてみるとすごく増えてる。
これって色々なやり方があるってことですよね。
なんだかやる気が出てきました。頑張ります。
回答ありがとうございました!

お礼日時:2005/10/21 10:09

こんにちは。



私の書き方ですと、以下のようになります。
変数がなければ、Selection の中は、達成されません。また、オートメーションを使う場合などのExcelのマクロの場合は、Selection は一回だけにして、変数に置き換えたほうが無難です。変数を使うときは、変数の型の宣言をするのが基本です。

.ColorIndex = xlAutomatic

VRamを使ったものは、経験的にマクロでは、うまくいかないときがあるます。なぜ、xlAutomatic を使わないかというのは、あまり理由はありませんが、明示的に色を入れたほうが無難です。また、ScreenUpdatingは、最後につけているのも、実験的にやってみてください。千回近くなって初めて、トラブルが出ることもありますから、一度や二度では分らないことがあります。

これらは、標準モジュールに取り付けてください。

Sub バツ罫線マクロ2()
Dim c As Range
 For Each c In Selection.Cells
 With c
   With .Borders(xlDiagonalDown)
    .LineStyle = xlContinuous
    .Weight = xlHairline
    .ColorIndex = 1
  End With
  With .Borders(xlDiagonalUp)
    .LineStyle = xlContinuous
    .Weight = xlHairline
    .ColorIndex = 1
  End With
  End With
 Next c
 Application.ScreenUpdating = True '念のため
End Sub


なお、おまけのショートカットキーをつけておきます。

Sub ShortCutSet()
'ショートカットをCtrl + L に設定
 Application.OnKey "^l", "バツ罫線マクロ2"
 Application.OnKey "^L", "バツ罫線マクロ2"

End Sub
Sub ShortCutSetOff()
'ショートカットを解除
 Application.OnKey "^l"
 Application.OnKey "^L"
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

オートメーションとかVRamとかScreenUpdatingとか、意味のわからない単語が目白押しですが勉強になります(手持ちのVBA辞典の索引にはありませんでした)。
どの記述がベスト、というものはあるものなんでしょうか。まずは美しいコードでなくてもやってみる事だと思っているのですが・・・。
ありがとうございました。

お礼日時:2005/10/20 17:27

まず一つ目。


「ActiveCell.Select」を削除してください。
これで、選択されたすべてのセルで罫線が引けます。

二つ目。
正直言って、私は罫線を引くだけなら変数を使う必要はないと
思います。
選択したセルに接するセル全部に引く、とか
ある条件を満たすセルに引く、とか言うなら、
そのセルを確定させるための何らかの条件を記述するために
必要でしょうけど。
    • good
    • 0
この回答へのお礼

素早い回答ありがとうございます。

ほ、本当だあ~~。なんか色々試していた自分がバカみたいです。

そうですか、この程度なら変数はいらないのですか。
ありがとうございました。

お礼日時:2005/10/20 17:02

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