いつもお世話になっております。良です。
環境はVB.NET2003 WinXP EXCEL2003です。
VB側からエクセルのセルを結合する操作がわかりません
Margeメソッドを使うのでしょうか?
調べてみたんですがうまく検索できませんした。
すみませんがご教授のほうよろしくお願いいたします。
Range指定してMergeメソッドで可能です
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で使えるように直すにはどうしたらよろしいでしょうか?
こんにちは良です。
<medakaさん
お返事ありがとうございました。
早速試してみます。
こんにちは良です。
'エクセルのセルの結合
xlRange.Merge("D1:E1")
をやったんですがうまく結合されませんでした。
xlCells.Merge(intY + 5, intX + 2)みたいに
セルのX軸とY軸を変数で指定したら「引数が多すぎます」
ってエラーが出てしまいました。
こういう使い方はいけないんでしょうか?
>こういう使い方はいけないんでしょうか?
いけません(><)。[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 を指定しても結合できるようです。
>Selectionのところで波線が出てしまい
Selection は選んだオブジェクトが何でも入る特殊なプロパティですので
直前に選んだ
xlRange("D1:E1")
に置き換えると同じ意味になります。
…あれ?…というか
xlRange("D1:E1")
っていいのかな?
xlRange = xlBook.Range("D1:E1")
じゃないか?Range が再帰的に新しい Range オブジェクトを返すから
解放漏れになるかもしれない。プロセス残ってたらここが原因かも
しれないのでチェックしてください。
あー。ちゃうちゃう(><)ブックに Range なんて無いよ。
xlRange = xlSheet.Range("D1:E1")
ごめんなさい。
こんばんは良です。
>特攻隊長まるるうさん
いつもいつもありがとうございます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につかまり
「種類が一致しません」というエラーが帰ってきてしまいました。
う〜んこのやり方もまずいんでしょうか?
ちなみに花さんの開放漏れ発見ソース
を入れていますので開放漏れがありましたら
とりあえずはプロセスで削除しています。
質問の趣旨とは離れてしまうので
回答はしていただかなくてもいいのですが
同じ処理をしても開放漏れの個数には
むらがあるのはなぜでしょうか?
一個のときと四個のときとないときとの
三つのパターンがあります。
……
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]で実行できませんでした。
>同じ処理をしても開放漏れの個数には
>むらがあるのはなぜでしょうか?
分かりません。同じ数のオブジェクトを使って、解放漏れの
回数が同じなら、結果も同じはずです。
こんにちは良です。
>xlRange("A1:B1").MergeCells = True
参照設定してればインテリセンス(入力候補)は有効だよね?
そこに出ていなければ間違ってると分かるはずですが?
xlRange("A1:B1").MergeCellsまでは入力候補が出てきて
=を入れてもtrue Falseの値は出てこなかったんですよ。
でもtrueを入れたらTrueとなったので使えるのかなと思ったんですが
結合はされなかったんですよ。。。
使えるかどうかは、
>xlRange("A1:B1")
がどういうオブジェクトを返すか調べてから判断してください。
>xlRange("A1:B1").MergeCellsまでは入力候補が出てきて
こちらでは戻り値が Object 型ですので MergeCells は
入力候補として表示されません。
結局、何かが省略されていると思うので悪いコードであることは
変わらないと思います。
ですから、
>[VB.NET2003]
> xlRange = xlSheet.Range("A1:B1")
> With xlRange
を使ってください。
こんばんは良です。
>特攻隊長まるるうさん
わかりました。いつも本当にありがとうございましたm(__)m
xlRange = xlSheet.Range("A1:B1")
> With xlRange
を素直に使わせていただきます。
ツイート | ![]() |