A 回答 (13件中1~10件)
- 最新から表示
- 回答順に表示
No.13
- 回答日時:
つづきです。
コピペで結合セルがペーストされてしまうことを失念していましたが、対応が少々やっかいです。
いろいろ考えてはみましたが、No7様の挙げていらっしゃる方法が簡単そうに思いました。
というわけで、No7様のコードと似ていますが・・・
以下のコードを、同じシートモジュールにコピペで追加します。
'//*** コピペでの結合対応
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, col As Long
col = Columns(specifiedCol).Column
For Each c In Target
If c.MergeCells And c.Column <> col Then
MsgBox "指定列以外は結合できません"
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
Exit Sub
End If
Next
End Sub
以上で、ひとまず対応ができるとは思いますが、コピペへの対応が全体的にみると異質になってしまっているので、この方法を採用するなら、他の部分の考え方(=最初のアイデア)を見直した方が良さそうな気がしました。
とは言え、それほどに時間が取れるわけでもありませんので、一連の回答は、これで一区切りとさせていただきます。
<訂正>
No12のコード中のコメントで
>'//*** メニューリセット、シート保護解除
とあるのは正しくありませんでした。「シートの保護解除」は行っていません。
コメントが正確ではないだけなので、コードは修正の必要はありません。
詳しく書いていただきありがとうございます。残念ながら今回は私の実力の無さから、目的を達成できませんでしたが、またいつかここを開いてトライしてみたいと思います。書類のミスを防ぐ目的で結合に関し、知るもんさせて頂きました。たくさんの方にアドバイス頂いてうれしかったです。皆様、ありがとうございました。
No.12
- 回答日時:
No4です
解決したのかしていないのか、よくわからない状態ですが・・・
少しだけ時間が取れたので、簡単にテストしてみました。
細かな部分でどうしたいのか不明点がたくさんありますが、勝手に仮定してあります。
対象とするシートの「シートモジュール」に以下をコピペします。
ただし、2行目の
Const cAction = "Sheet1.specialMerge"
の「Sheet1」の部分を当該シートのオブジェクト名にしておく必要があります。
オブジェクト名とは、シート名(Sheet.Name)とは異なり、エクセル側で設定しているシートの名前(Sheet.CodeName)のことです。
新規作成したブックのシート名とオブジェクト名は一致していますので、意味がわからない場合は、まず新規ブックで試してみてください。
結合を許可する列を3行目の
Const specifiedCol = "B"
に記載します。(例ではB列が結合可能。他は不可)
以上が済んだら、一度他のシートを表示してから再度シートを表示します。
適当なセルで右クリックをすると「セルの書式設定」がグレーアウトされ、一番下に「結合(指定列のみ)」というメニューが表示されているものと思います。
この状態は、シートの保護(パスワード無し)がかけられた状態になっています。
基本的には以上で、指定列(B列)以外の結合ができない状態になっていると思います。
・・・というはずでしたが、アイデア作成時点では、No7様ご指摘のコピペによる結合のペーストを考慮していませんでしたので、このままではコピペで結合ができてしまいます。
長くなってしまいましたので、コピペ対策は別投稿にすることにして、ひとまずここまで。
Const cName = "結合(指定列のみ)"
Const cAction = "Sheet1.specialMerge"
Const specifiedCol = "B"
Dim protectFlag
'//*** メニューセット、シート保護
Private Sub Worksheet_Activate()
If Not chkMenu() Then
With Application.CommandBars("cell").Controls.add()
.Caption = cName
.OnAction = cAction
End With
End If
If Not protectFlag Then
ActiveSheet.Unprotect
Cells.Locked = False
ActiveSheet.Protect UserInterfaceOnly:=True
protectFlag = True
End If
End Sub
'//*** メニューリセット、シート保護解除
Private Sub Worksheet_Deactivate()
If chkMenu() Then
Application.CommandBars("Cell").Controls(cName).Delete
End If
End Sub
'//*** メニュー存在チェック
Function chkMenu() As Boolean
Dim f As Boolean, ctl
f = False
For Each ctl In Application.CommandBars("cell").Controls
If ctl.Caption = cName Then f = True
Next ctl
chkMenu = f
End Function
'//*** セル結合(指定列のみ)
Public Sub specialMerge()
Dim r As Range
Set r = Intersect(Selection, Columns(specifiedCol))
If r Is Nothing Then
MsgBox "指定された列の範囲で選択してください"
ElseIf Selection.Count <> r.Count Then
MsgBox "結合できるのは" & specifiedCol & "列だけです"
ElseIf Selection.Areas.Count > 1 Then
MsgBox "複数の範囲の結合はできません"
Else
Selection.UnMerge
Selection.Merge
End If
End Sub
No.8
- 回答日時:
No4です。
>No.4の方、申し訳ありませんが、再度わかりやすくご説明頂けないでしょうか?
現在PC環境がないため回答ができないのと、来週はたてこんでいてすぐには回答できそうもありません。
情況にもよりますが、最悪だと週末なので、かなり遅くなってしまいそうです。
私の考え方は示してあるので、どなたかが具体化してくださるかもしれません。
また、ご質問の内容を実現する方法はひとつとは限りませんので、他の回答者がアイデアを出してくださることもあるでしょう。
ご質問を実現できるなら方法は問わないものと思いますので、早い回答で満足のいくものがあれば、そちらをご採用なさってください。
No.7
- 回答日時:
こんなのはどうでしょうか。
SelectionChangeイベントで、選択範囲が「B列を含む、且つ、複数セル」の場合、シートにプロテクトをかけています。それ以外の場合はプロテクトを解除します。基本的に、これだけで結合(正確には書式設定)は出来なくなります。
ただし、結合されているセルをB列にコピーすることはできてしまうので、それを防止するためにChangeイベントで、Undoをかけてみました。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Intersect(Range("B:B"), Target) Is Nothing Or _
Target.CountLarge <= 1 Then
If ActiveSheet.ProtectionMode Then ActiveSheet.Unprotect
Else
Cells.Locked = False
ActiveSheet.Protect UserInterfaceOnly:=True
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
On Error Resume Next
If IsNull(Range("B:B").MergeCells) Then
MsgBox "B列を結合することはできません。"
Application.Undo
End If
Application.EnableEvents = True
End Sub
No.6
- 回答日時:
No.3です
「あるセルは結合できないが、その他のセルは結合ができる」
出来ますよ
Targetのプロパティで
Row(縦位置)、Rows.Count(縦選択数)、Column(横位置)、Columns.Count(横選択数)
がありますが、これらは複数選択の際の座標を取得できるものです
なので、それぞれに判定を加えればいいので、例えば結合したくないセル範囲がA5~C10だけだとします、この場合座標で表記すると(1,5),(3,5),(1,10),(3,10)の範囲に複数選択の範囲が重なっていればNGという判定式にして
前回の「If Selection.Count > 1 Then」の部分に当てはめればいいのです
ではその判定式とは?
選択不可の四角い範囲と選択された四角い範囲が重なっているかどうかを見るので
それぞれ縦横の二次元判定を行います
R1 <= Target.Row + Target.Rows.Count - 1
R2 >= Target.Row
C1 <= Target.Column + Target.Columns.Count - 1
C2 >= Target.Column
この4つの条件を全て満たす場合に、それぞれの選択範囲が重なっているということになるのでとりあえず初めからすべてのコードを記載しておきます
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim R1 As Integer
Dim R2 As Integer
Dim C1 As Integer
Dim C2 As Integer
R1 = 1
R2 = 3
C1 = 5
C2 = 10
If Selection.Count > 1 Then
If R1 <= Target.Row + Target.Rows.Count - 1 And _
R2 >= Target.Row And _
C1 <= Target.Column + Target.Columns.Count - 1 And _
C2 >= Target.Column Then
Cells(Target.Row, Target.Column).Select
End If
End If
End Sub
今回は変数を使用します
変数とは「Dim~」と記載しているところで、それぞれ4つの変数を数値として使いますと宣言している部分です。値を代入したり変化させたりする箱のようなものですね
なので、中段あたりにある4行の数値を変更するだけで、好きな範囲に対して結合操作が出来なくなります
ちなみに範囲が複数ある場合には変数を設定しているところから最初のIF文の最後の行までを繰り返し記載すればいくらでも設定可能です
べっ、別にNo.4の方に負けたくないとか、そんなんじゃないんだからね!
お試しください(笑)
ありがとうございます。今、やってみています。If R1 < =からの4行が赤字になってしまいます。同じように打ち込んでいるのですが。何が悪いのでしょうか?
No.5
- 回答日時:
No.3です
「教えてやろうという方」
呼びましたか?(笑)
コードとは?
Excelでもっといろんなことが出来るようになるプログラミングです
VisualBasicApplicationという言語で、基本はBASICという簡易プログラム言語をVISUAL化したものでVBと言います。それを更にOFFICEのアプリに特化したものということですね
プログラムが分からない人にとってはちんぷんかんぷんだと思いますが、実はプログラムって命令が3つしかないんですよ!
プログラマーという人たちは、言語を知っているというよりはロジックを組み立てる技術を持っている人なのです
おっと、話が脱線してきているので一先ず本題に
では一通りの手順です
・ファイルメニューよりオプションを選択
・リボンのユーザー設定タブを選択
・画面右欄リボンのユーザー設定メイン タブの中で開発のチェックボックスをON
・ウィンドウを閉じると開発タブが追加されています
これでコードが触れるようになりました
上段メニューの右端に開発タブが表示されますので、選択してみてください
一番左にある『Visual Basic』を押すとコードの画面が開きます
画面左の「プロジェクト」ウィンドウにVBAProject("ブック名")
階層を下げて「Microsoft Excel Objects」というフォルダがあります
更に下の階層に「Sheet1("シート名")」と「ThisWorkbook」というのがあると思います
では「Sheet1」をダブルクリックしてください、右側に真っ白なウィンドウが開きますので、左上の「(General)」の右側にあるプルダウン(▼)を押して「Worksheet」を選択してください。
すると下に「~SelectionChange」というのが勝手に記載されます
そしたら前回No.3で記載したコードをその中にそのまま張り付けて下さい
作業は以上で終了です
なんのこっちゃ!
という反論のために少し補足します
今コードを記載したところはSheet1に限定した機能の追加です
右側Worksheetというオブジェクトの中で、SelectionChange(セルの移動や選択の変更など)が行われた時になんらかの命令を下す
ということですね
先頭行の右側に「Target」というのがあると思いますが、ここにセルの情報が引き継がれてくるのです
前回のプログラムを要約すると
'当該ワークシートでセル選択が変更された場合
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'選択されたセルの数が1つじゃない時に
If Selection.Count > 1 Then
'選択された先頭のセルがA列(1列目)ではない時に
If Target.Column > 1 Then
'選択された先頭のセルにフォーカスを移動する
Cells(Target.Row, Target.Column).Select
End If
End If
End Sub
といった感じでしょうか。つまり「もしA列を起点としない複数選択が行われた場合に、強制的に複数選択を解除して先頭のセルにフォーカスを戻す」という処理になるわけです
ん~~~長い・・・
ソロソロ読むのも疲れてきたでしょうから、この辺で去ります(笑)
なんと、できました。 結合はできないが入力が出来ました。びっくり。ありがとうございました。ですが、あるセルは結合できないが、その他のセルは結合ができるというのが目標です。No.4の方の方法がそれだと思うのですが、No.4の方、申し訳ありませんが、再度わかりやすくご説明頂けないでしょうか?
No.4
- 回答日時:
こんにちは
No3様のアイデアがかなり良さそうに思いますが、思いついたので別案です。
結合する際の手順が少し変わりますが、かえって操作手間は減ることになるかも。
(右クリックからのメニュー選択だけで結合できるようになるので)
内容のイメージとして、
セルのロックを外した状態で、シートの保護をかけます。
(必要なら「セルの書式設定」も許可してもよい)
この状態で、各セルの入力は可能だが結合・解除はできない状態になります。
セルの右クリックメニューに「セル結合」を新しく登録しておいて、このメニュー経由で(指定された範囲であれば)セルの結合を行えるようにします。
後半部分の実現方法はマクロによることになりますが、
・ブックオープン時に右クリックメニューにマクロを登録
・メニューに対応するマクロは
「選択範囲がA列内のみであれば結合する」内容
・ブッククローズ時に登録マクロを削除
といった感じでマクロを作成しておけば、あとは自動的に実現されるようにすることができるものと思います。
※ 対象が1シートだけの場合は、上記の登録・削除をシートの開閉に連動させるようにしておけばよいでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 結合セルのソートについて 5 2022/04/22 11:57
- Excel(エクセル) エクセル 自動計算 1 2023/01/30 13:28
- Excel(エクセル) Excel2007での条件付き書式について 6 2023/05/02 10:56
- Excel(エクセル) エクセルで文字列と数字が混在する列に書式設定したい。 3 2022/12/19 09:11
- Excel(エクセル) Excelのマクロで、特定のセルから順番に値を取得したい 5 2022/12/06 15:34
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/12/26 14:27
- Excel(エクセル) 判定結果に応じて〇印(図形)をつけるマクロ 4 2022/10/30 11:22
- Visual Basic(VBA) VBA 検索と入力 Excel ブック ぶぶぶ シート ししし 列V 検索対象の列です 最終行は、お 6 2023/05/17 01:40
- Excel(エクセル) 重複データの抽出について 2 2023/07/21 14:52
- Excel(エクセル) Excel 毎日手作業で時間がかかって、泣きたいです、、、VBAのプロの方、助けてください。。。 3 2022/10/25 04:26
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定の文字がある行以外を削除...
-
excelのデータで色つき行の抽出...
-
直近の5個の平均を求めたい
-
[EXCEL]ボタン押す→時刻が表に...
-
【Excel関数】UNIQUE関数で"0"...
-
アクティブになっている行をマ...
-
エクセル マクロで数値が変っ...
-
Excel グラフのプロットからデ...
-
【EXCEL】連続データの個数を抽...
-
エクセルで特定の文字列が入っ...
-
Excel 時刻の並び替え
-
エクセルのセルに指定画像(.jpg...
-
チェックボックスをクリックし...
-
セルの色によって条件文をつけ...
-
エクセル マクロ オートフィ...
-
エクセル2016で時間を入力して...
-
電話番号の入力方式が違うデー...
-
このような複雑な表をワードで...
-
エクセルで、ポインタのある行...
-
Excel マクロで特定のセルに入...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで特定の文字列が入っ...
-
エクセル マクロ オートフィ...
-
【Excel関数】UNIQUE関数で"0"...
-
[EXCEL]ボタン押す→時刻が表に...
-
結合されたセルをプルダウンの...
-
エクセル マクロで数値が変っ...
-
Excel グラフのプロットからデ...
-
AのセルとB行を比較して、一致...
-
エクセル 上下で列幅を変えるには
-
Excel ウインドウ枠の固定をす...
-
特定の文字がある行以外を削除...
-
excelのデータで色つき行の抽出...
-
エクセル2016で時間を入力して...
-
excel 小さすぎて見えないセル...
-
EXCELで最後の行を固定
-
エクセルVBA 最終行を選んで並...
-
VBAで色の付いているセルの行削除
-
エクセルマクロで偶数行(又は...
-
エクセルのセルに指定画像(.jpg...
-
罫線の斜線を自動で引くマクロ
おすすめ情報
すみません、書き方が悪かったです。結合はできないが、入力はできるようにしたいのです。
「ブックオープン時に右クリックメニューにマクロを登録」以降を具体的に教えていただくことはできますでしょうか?今、No.3の方の記入はできるが、結合はできないまで、ついて行っています。
赤字は消えたのですが、結合できてしまいます。A5~C10です。何が悪いのでしょうか。