VB操作でエクセルのセルを結合するには?

解決


  2006-07-07 00:34:27  No: 132242

いつもお世話になっております。良です。
環境はVB.NET2003 WinXP EXCEL2003です。

VB側からエクセルのセルを結合する操作がわかりません
Margeメソッドを使うのでしょうか?

調べてみたんですがうまく検索できませんした。
すみませんがご教授のほうよろしくお願いいたします。


medaka  2006-07-07 00:37:00  No: 132243

Range指定してMergeメソッドで可能です


  2006-07-07 00:40:36  No: 132244

xlRange("D1:E1").Select()
            With Selection
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
                .WrapText = False
                .Orientation = 0
                .AddIndent = False
                .IndentLevel = 0
                .ShrinkToFit = False
                .ReadingOrder = xlContext
                .MergeCells = False
            End With
            Selection.Merge()
こんにちは良です。マクロの記録では
上記のように出ました。
ですがSelectionのところで波線が出てしまいプロパティの中身が
全部波線が出てしまいました。
VB.NETで使えるように直すにはどうしたらよろしいでしょうか?


  2006-07-07 00:42:53  No: 132245

こんにちは良です。

<medakaさん

お返事ありがとうございました。
早速試してみます。


  2006-07-07 00:55:40  No: 132246

こんにちは良です。

'エクセルのセルの結合
            xlRange.Merge("D1:E1")

をやったんですがうまく結合されませんでした。
xlCells.Merge(intY + 5, intX + 2)みたいに
セルのX軸とY軸を変数で指定したら「引数が多すぎます」
ってエラーが出てしまいました。
こういう使い方はいけないんでしょうか?


特攻隊長まるるう  2006-07-07 01:56:48  No: 132247

>こういう使い方はいけないんでしょうか?
いけません(><)。[Excel VBA]のヘルプにちゃんと引数の説明も載ってるから
読むようにしてください。
マクロのコードの部分を選択して[F1]キーを押してみてください。

以下、ヘルプより抜粋(ボクは Excel 2002 だから仕様が違ってたら教えてください。)
>Merge メソッド
>▼Merge メソッドを Range オブジェクトに指定した場合
>expression.Merge(Across)
>expression   必ず指定します。Range オブジェクトを返すオブジェクト式を指定します。
>Across   省略可能です。バリアント型 (Variant) の値を使用します。True を設定すると、
>指定した範囲の各行のセルを結合して 1 つのセルにします。既定値は False です。
引数は1つですので2つも設定すれば怒られて当然です。 True を設定してください。

ちなみに、こちらでセルの書式設定『セルを結合する』のマクロを記録すると
    With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = True '←ここ
    End With

MergeCells を指定しても結合できるようです。


特攻隊長まるるう  2006-07-07 02:00:44  No: 132248

>Selectionのところで波線が出てしまい
Selection は選んだオブジェクトが何でも入る特殊なプロパティですので
直前に選んだ
    xlRange("D1:E1")
に置き換えると同じ意味になります。


特攻隊長まるるう  2006-07-07 02:06:32  No: 132249

…あれ?…というか
  xlRange("D1:E1")
っていいのかな?
  xlRange = xlBook.Range("D1:E1")
じゃないか?Range が再帰的に新しい Range オブジェクトを返すから
解放漏れになるかもしれない。プロセス残ってたらここが原因かも
しれないのでチェックしてください。


特攻隊長まるるう  2006-07-07 02:09:00  No: 132250

あー。ちゃうちゃう(><)ブックに Range なんて無いよ。
   xlRange = xlSheet.Range("D1:E1")
ごめんなさい。


  2006-07-07 02:46:48  No: 132251

こんばんは良です。

>特攻隊長まるるうさん
いつもいつもありがとうございますm(__)m
VB.NETでエクセルを操作してもVB.NETのヘルプには
乗っていなくてエクセルVBAのヘルプに乗っているんですね。
まるるうさんの助言を受けてSelectionのところを
xlRange = xlSheet.Range("A1:B1")に変えて
やりましたら波線が出てしまいました。

   With xlRange = xlSheet.Range("A1:B1")

                        .HorizontalAlignment = xlGeneral
                        .VerticalAlignment = xlCenter
                        .WrapText = False
                        .Orientation = 0
                        .AddIndent = False
                        .IndentLevel = 0
                        .ShrinkToFit = False
                        .ReadingOrder = xlContext
                        .MergeCells = True '←ここ
                    End With
でしたのでこんどは

 xlRange("A1:B1").MergeCells = True

を試してみたんですが。Try〜Catchにつかまり
「種類が一致しません」というエラーが帰ってきてしまいました。
う〜んこのやり方もまずいんでしょうか?


  2006-07-07 02:52:23  No: 132252

ちなみに花さんの開放漏れ発見ソース
を入れていますので開放漏れがありましたら
とりあえずはプロセスで削除しています。
質問の趣旨とは離れてしまうので
回答はしていただかなくてもいいのですが
同じ処理をしても開放漏れの個数には
むらがあるのはなぜでしょうか?
一個のときと四個のときとないときとの
三つのパターンがあります。


特攻隊長まるるう  2006-07-10 22:46:09  No: 132253

……
Merge メソッドの使用はやめたんですね?

>やりましたら波線が出てしまいました。
波線が出たらエラーメッセージも出ているはずなので
エラーメッセージを書かないと意味がありません。
 # ついでに言えば、そのエラーの基本的な対処方法も
 # ヘルプに載ってます。[タスク一覧]上で選択して[F1]
 # キーでヘルプに飛びます。(所詮、自動なので対処法
 # が間違ってる場合も多いですが。)

>   With xlRange = xlSheet.Range("A1:B1")
いや、同時にやらないで(^^;)。。。
[VB.NET2003]
        xlRange = xlSheet.Range("A1:B1")
        With xlRange

>xlRange("A1:B1").MergeCells = True
参照設定してればインテリセンス(入力候補)は有効だよね?
そこに出ていなければ間違ってると分かるはずですが?
>xlRange("A1:B1")
は悪いコードですが、
  Public Overridable Default Property _Default(
  Optional ByVal RowIndex As Object = Nothing, 
  Optional ByVal ColumnIndex As Object = Nothing) As Object
という Default 指定されたプロパティが使われています。
(変数にカーソルを当てれば表示されると思います。)
RowIndex と ColumnIndex を指定しないと間違いです。
また、Item プロパティのことですので、使う場合はそちらを
使ってください。
 # [Excel VBA]のヘルプには
 # Worksheets("Sheet1").Range.Item("A1:A10").FillDown
 # とか書いてありましたが、[Excel VBA]で実行できませんでした。

>同じ処理をしても開放漏れの個数には
>むらがあるのはなぜでしょうか?
分かりません。同じ数のオブジェクトを使って、解放漏れの
回数が同じなら、結果も同じはずです。


  2006-07-10 23:40:55  No: 132254

こんにちは良です。

>xlRange("A1:B1").MergeCells = True
参照設定してればインテリセンス(入力候補)は有効だよね?
そこに出ていなければ間違ってると分かるはずですが?

xlRange("A1:B1").MergeCellsまでは入力候補が出てきて
=を入れてもtrue Falseの値は出てこなかったんですよ。
でもtrueを入れたらTrueとなったので使えるのかなと思ったんですが
結合はされなかったんですよ。。。


特攻隊長まるるう  2006-07-11 00:28:59  No: 132255

使えるかどうかは、
>xlRange("A1:B1")
がどういうオブジェクトを返すか調べてから判断してください。
>xlRange("A1:B1").MergeCellsまでは入力候補が出てきて
こちらでは戻り値が Object 型ですので MergeCells は
入力候補として表示されません。

結局、何かが省略されていると思うので悪いコードであることは
変わらないと思います。
ですから、
>[VB.NET2003]
>        xlRange = xlSheet.Range("A1:B1")
>        With xlRange
を使ってください。


  2006-07-11 06:18:09  No: 132256

こんばんは良です。

>特攻隊長まるるうさん

わかりました。いつも本当にありがとうございましたm(__)m

xlRange = xlSheet.Range("A1:B1")
>        With xlRange

を素直に使わせていただきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加