『ボヘミアン・ラプソディ』はなぜ人々を魅了したのか >>

例えば、A列は縦に結合できるが、B列は結合できない、という風に設定できませんか?

質問者からの補足コメント

  • すみません、書き方が悪かったです。結合はできないが、入力はできるようにしたいのです。

      補足日時:2019/05/22 19:28
  • 「ブックオープン時に右クリックメニューにマクロを登録」以降を具体的に教えていただくことはできますでしょうか?今、No.3の方の記入はできるが、結合はできないまで、ついて行っています。

    No.4の回答に寄せられた補足コメントです。 補足日時:2019/05/24 20:16
  • 赤字は消えたのですが、結合できてしまいます。A5~C10です。何が悪いのでしょうか。

    No.10の回答に寄せられた補足コメントです。 補足日時:2019/05/27 16:47

A 回答 (13件中1~10件)

つづきです。



コピペで結合セルがペーストされてしまうことを失念していましたが、対応が少々やっかいです。
いろいろ考えてはみましたが、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のコード中のコメントで
 >'//*** メニューリセット、シート保護解除
とあるのは正しくありませんでした。「シートの保護解除」は行っていません。
コメントが正確ではないだけなので、コードは修正の必要はありません。
    • good
    • 0
この回答へのお礼

詳しく書いていただきありがとうございます。残念ながら今回は私の実力の無さから、目的を達成できませんでしたが、またいつかここを開いてトライしてみたいと思います。書類のミスを防ぐ目的で結合に関し、知るもんさせて頂きました。たくさんの方にアドバイス頂いてうれしかったです。皆様、ありがとうございました。

お礼日時:2019/05/30 14:50

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
    • good
    • 0

そんなはずは・・・


Worksheet_SelectionChangeに記載していますよね?
No.6のコードをそのまま張り付けてみて下さい
指定範囲は選択が出来ないので結合うんぬんという段階には至らないはずですが・・・
    • good
    • 0
この回答へのお礼

Worksheet_SelectionChangeに記載しています。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)の行が黄色くハイライトされているのが何か悪い兆候でしょうか?

お礼日時:2019/05/27 17:48

No.6ですが!


もとい、『_(アンダーライン)』自体の記載が無いのかもしれません
基本的にIF文は一行で記載しなければなりません
それを補うために『_』を使用して、次の行に続きますよという命令をしているのです
ただしこの場合には、数式から一つスペースを開けて記載しなければならないので注意してください
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございますアンダーラインのスペースでした。赤字が消えました!

お礼日時:2019/05/27 16:30

No.6です


赤字になるということは数式が正しくないなどなど
恐らくですが、文末の「_」(アンダーライン)の前に空白が無いのではないでしょうか
    • good
    • 0

No4です。



>No.4の方、申し訳ありませんが、再度わかりやすくご説明頂けないでしょうか?
現在PC環境がないため回答ができないのと、来週はたてこんでいてすぐには回答できそうもありません。
情況にもよりますが、最悪だと週末なので、かなり遅くなってしまいそうです。

私の考え方は示してあるので、どなたかが具体化してくださるかもしれません。
また、ご質問の内容を実現する方法はひとつとは限りませんので、他の回答者がアイデアを出してくださることもあるでしょう。

ご質問を実現できるなら方法は問わないものと思いますので、早い回答で満足のいくものがあれば、そちらをご採用なさってください。
    • good
    • 0

こんなのはどうでしょうか。


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
    • good
    • 0

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の方に負けたくないとか、そんなんじゃないんだからね!

お試しください(笑)
    • good
    • 0
この回答へのお礼

ありがとうございます。今、やってみています。If R1 < =からの4行が赤字になってしまいます。同じように打ち込んでいるのですが。何が悪いのでしょうか?

お礼日時:2019/05/27 15:34

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列を起点としない複数選択が行われた場合に、強制的に複数選択を解除して先頭のセルにフォーカスを戻す」という処理になるわけです

ん~~~長い・・・
ソロソロ読むのも疲れてきたでしょうから、この辺で去ります(笑)
    • good
    • 0
この回答へのお礼

なんと、できました。  結合はできないが入力が出来ました。びっくり。ありがとうございました。ですが、あるセルは結合できないが、その他のセルは結合ができるというのが目標です。No.4の方の方法がそれだと思うのですが、No.4の方、申し訳ありませんが、再度わかりやすくご説明頂けないでしょうか?

お礼日時:2019/05/24 20:13

こんにちは



No3様のアイデアがかなり良さそうに思いますが、思いついたので別案です。
結合する際の手順が少し変わりますが、かえって操作手間は減ることになるかも。
(右クリックからのメニュー選択だけで結合できるようになるので)

内容のイメージとして、
セルのロックを外した状態で、シートの保護をかけます。
(必要なら「セルの書式設定」も許可してもよい)
この状態で、各セルの入力は可能だが結合・解除はできない状態になります。
セルの右クリックメニューに「セル結合」を新しく登録しておいて、このメニュー経由で(指定された範囲であれば)セルの結合を行えるようにします。


後半部分の実現方法はマクロによることになりますが、
・ブックオープン時に右クリックメニューにマクロを登録
・メニューに対応するマクロは
 「選択範囲がA列内のみであれば結合する」内容
・ブッククローズ時に登録マクロを削除
といった感じでマクロを作成しておけば、あとは自動的に実現されるようにすることができるものと思います。

※ 対象が1シートだけの場合は、上記の登録・削除をシートの開閉に連動させるようにしておけばよいでしょう。
この回答への補足あり
    • good
    • 0
この回答へのお礼

ご親切にありがとうございます。

お礼日時:2019/05/23 22:12

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング