
現在下記のマクロで複数セルに一度に〇印(楕円)をつける作業をしています。
やりたいこと
①セルの幅に合わせて〇をつける(楕円ではなく円)・・・縦長のセルのため
②結合したセルには一つの〇(円)が描かれるようにする(現在はセル数分〇印が描かれてしまう)。
以上です。どなたか記述を修正していただけませんでしょうか。
Sub 選択した複数セルに〇印()
For Each r In Selection
Set s = ActiveSheet.Shapes.AddShape(msoShapeOval, r.Left, r.Top, r.Width, r.Height)
s.Fill.Visible = msoFalse
s.IncrementLeft 0
s.IncrementTop 0
With s.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
.Transparency = 0
.Weight = 1.5
End With
Next
End Sub
No.4ベストアンサー
- 回答日時:
こんにちは
>①セルの幅に合わせて〇をつける
「幅」に合わせるという決め打ちで良いのなら、No1様の回答にある通り、サイズを幅で決めるようにすればよいです。
セル形状が不明の場合は、縦横の小さい方の値を採用すれば宜しいでしょう。
表示位置をどこにするのかご質問文にないのではっきりとしませんが、左上合わせとか中央合わせとかはサイズを決めてから計算すれば良いでしょう。
>②結合したセルには一つの〇(円)が描かれるようにする
For Eachでループさせているので、結合セルの場合はその構成セル数分だけループすることになりますので、現状のままだとその個数分描かれることになります。
仮に結合セルが無くても、複数のセル範囲を重なりがあるように選択してループすると、重なっている部分は重複してカウントされるので、同様のことが発生します。
これを回避するには、選択セルの内容を解析して(結合セルを含め)重複が無いようにしてからループすれば良いですが、解析するのが結構面倒ですね。
代替案として、(効率はやや落ちますが)「セル内の作成された円」を削除してから円を描くようにすれば、結果的に必ずひとつだけ残ることになります。
以下は、そのような方法での一例です。
※ 作成する円は、セルに対して中央合わせにしてあります。
※ 非表示セルには図形を描けないので、非表示セルは飛ばしています。
(一旦、表示してから描けば描けますけれど・・)
※ 当該マクロで作成した図形以外の図形はそのまま残ります。
※ 選択内容がセル範囲ではない場合には何もしません。
Sub Sample()
Dim r As Range, c As Range, s As Shape
Dim x As Single, y As Single, z As Single
If TypeName(Selection) <> "Range" Then Exit Sub
For Each r In Selection.Cells
If Not (r.EntireRow.Hidden Or r.EntireColumn.Hidden) Then
Set c = r.MergeArea
For Each s In ActiveSheet.Shapes
If Not Intersect(c, Range(s.TopLeftCell, s.BottomRightCell)) Is Nothing Then
If s.AlternativeText = "HOGE_OVAL" Then s.Delete
End If
Next s
z = Application.Min(c.Width, c.Height) - 2
x = c.Left + (c.Width - z) / 2
y = c.Top + (c.Height - z) / 2
With ActiveSheet.Shapes.AddShape(msoShapeOval, x, y, z, z)
.Fill.Visible = msoFalse
.Line.Visible = msoTrue
.Line.ForeColor.RGB = RGB(0, 0, 0)
.Line.Transparency = 0
.Line.Weight = 1.5
.AlternativeText = "HOGE_OVAL"
End With
End If
Next r
End Sub
本当にありがとうございます。懇切丁寧なご説明までいただき感謝申し上げます。一つづつ調べながら理解しようと努めているところです。
思った通りに〇印を書くことができ大変助かりました。
No.3
- 回答日時:
#2です
動くけれど違うようなので訂正
Dim wh As Double
Property Height As Single
Excel.Shape のメンバー なので
Dim wh As Single
Set r = r.MergeArea
ループに使っているRangeオブジェクトを再セットは良くないかも知れません
新たに Rangeオブジェクト変数をたてる方が好ましいと思います
No.2
- 回答日時:
こんにちは
ちょっと改造して
Sub 選択した複数セルに〇印()
Dim r As Range, s As Shape
Dim wh As Double
For Each r In Selection
If r.Address = r.MergeArea(1).Address Then
Set r = r.MergeArea
wh = WorksheetFunction.Min(r.Width, r.Height)
Set s = ActiveSheet.Shapes.AddShape(msoShapeOval, r.Left, r.Top, wh, wh)
s.Left = r.Left + (r.Width - s.Width) / 2
s.Top = r.Top + (r.Height - s.Height) / 2
s.Fill.Visible = msoFalse
s.IncrementLeft 0
s.IncrementTop 0
With s.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
.Transparency = 0
.Weight = 1.5
End With
End If
Next
End Sub
If r.Address = r.MergeArea(1).Address Then
Set r = r.MergeArea
この書き方は調べてみてください
No.1
- 回答日時:
>AddShape(msoShapeOval, r.Left, r.Top, r.Width, r.Height)
高さも横幅で指定する。
AddShape(msoShapeOval, r.Left, r.Top, r.Width, r.Width)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
初めてマクロを入力しますが、テキストとおりに入力したのに構文エラーです。修正を教えてください。
Visual Basic(VBA)
-
なぜこんな初歩的なVBAのIf文でエラーか発生して使えないのか、全く理解出来ません。誰か助けてくださ
Visual Basic(VBA)
-
マクロのコードを、少しでも削って短くしたい
Excel(エクセル)
-
4
ExcelのVBAでシフト表を作っていますが、バグが出て困っています
Visual Basic(VBA)
-
5
VBAでのフルパスの取得
Visual Basic(VBA)
-
6
【ご教示ください】VBAの記述方法がわかりません。
Visual Basic(VBA)
-
7
【VBA】印刷マクロのループ処理が反映されません
Visual Basic(VBA)
-
8
VBAでエクセルをtxtに変換するとエクセルでカンマを含む文字数字がtxtでは「"」付にならないよ
Visual Basic(VBA)
-
9
稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何
Visual Basic(VBA)
-
10
【マクロ】フォルダにファイルが1つも無い時に、ファイルがありませんとメッセージを表示する
Visual Basic(VBA)
-
11
Excel vbaについて知恵もしくは、コード教えて下さいm(__)m ① 表にあるデータをコピー、
Visual Basic(VBA)
-
12
顧客ごとに違う点検案内を作成するマクロ
Visual Basic(VBA)
-
13
動かなくなってしまった古いVBAを動くようにしたい
Visual Basic(VBA)
-
14
【至急】 当方初心者です。 マクロについて知恵をお貸しください。 ★したい動作 ①リストE列2行目か
Visual Basic(VBA)
-
15
【VBAエラー】Nextに対するForがありません 対策について
Visual Basic(VBA)
-
16
VBA初心者です。電話番号の数字の前に0を表示させたいです。
Visual Basic(VBA)
-
17
Countifよりも早く重複数をカウントする方法ありますか?
Excel(エクセル)
-
18
この関数と同じ処理をVBAで行うにはどうしたら良いでしょうか? これは、1列の中に同じ値が複数存在し
Visual Basic(VBA)
-
19
指定した文字から指定した文字のスペースまでを削除するVBAの構文について
Visual Basic(VBA)
-
20
フレーム内のオプションボタンの選択結果をセルに書き出したい。 図のような預金種目というフレームにオプ
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
このカテゴリの人気Q&Aランキング
-
4
別シートから年齢別の件数をカ...
-
5
別のシートから値を取得するとき
-
6
ExcelのVBAコードについて教え...
-
7
特定のPCだけ動作しないVBAマク...
-
8
【VBA】Excelの特定範囲のセル...
-
9
別シートから年齢別の件数をカ...
-
10
【Excel VBA】指定行以降をクリ...
-
11
VBA シートのボタン名を変更し...
-
12
エクセルのエラーメッセージ「4...
-
13
ExcelVBAを使って、値...
-
14
グラフの交点の求め方(Excel)
-
15
Excel VBAについて、 フォルダ...
-
16
アウトルックが起動しているか...
-
17
メッセージボックスのOKボタ...
-
18
ExcelのVBAコードについて教え...
-
19
エクセルvbaでdocuworksprinter...
-
20
個別に違う添付ファイルを付け...
おすすめ情報
公式facebook
公式twitter