マージセルの範囲


はじめて質問します。  2005-08-29 15:58:05  No: 91858  IP: [192.*.*.*]

いつも参考にしています。結構レベルの高い質問が多くて書き込みしていいものかどうか解らないのですが、自分で調べてもまったく解決できないのでかきこさせていただきます。
本題なのですが
VBからエクセルを操作したときに指定のセルがマージされているかの判定で
『MergeArea』や『.Address』『MergeCells』を使っているのですが横の列だけを出したいときに"$A$3"みたいのから文字を切り出して取り出しているのですが、もっといい方法ありませんか?たとえば『.Address』で一撃で取り出せるとかなり綺麗に書けるとおもうんですが
レベルの低い質問でしたらすいません、よろしくお願いします。

編集 削除
特攻隊長まるるう  2005-08-29 16:21:30  No: 91859  IP: [192.*.*.*]

すいません。
…主語と結果が曖昧なのでちょっと理解できませんでした。
MergeArea プロパティのヘルプに次のサンプルが載ってます。
何を入力として("$A$3"ですか?)どういう結果が欲しいですか?
(横の列数ですか?)

>次の使用例は、セル A3 がある結合セル範囲に値を設定します。
>Set ma = Range("a3").MergeArea
>If ma.Address = "$A$3" Then
>    MsgBox "結合セル範囲に指定したセルはありません。"
>Else
>    ma.Cells(1, 1).Value = "42"
>End If

>横の列だけを出したいときに
結合セル範囲の横の列ですか?
    Debug.Print ma.Cells(1, 1).Row
    Debug.Print ma.Rows.Count
とかで必要な情報は得られますか?

編集 削除
はじめて質問します  2005-08-29 17:42:29  No: 91860  IP: [192.*.*.*]

特攻隊長まるるうさん即答ありがとうございます。
説明悪くてすいませんです。もういっぱいいっぱいです。
今は
set A = Range(xlsSheet.Call(1,i)).MergeArea
B = A.Addres _(ReferenceStyle:=xlR1C1,RowAbsolute:=True,ColumnAbsolute:=False)
で求めています。
この後にInStrで"["と"]"を検索し、その間にある文字をCligで数字に変えているのですがどうもうまく動きません
プログラム的にはマージしたセルの横の長さを違うシートの一つのセルに設定したいだけなんですが・・・・
よろしくお願いします

編集 削除
はじめて質問します  2005-08-29 17:44:02  No: 91861  IP: [192.*.*.*]

すいません
>set A = Range(xlsSheet.Call(1,i)).MergeArea
ではなく
set A = Range(xlsSheet.Call(1,i),xlsSheet.Call(1,i)).MergeArea
でした

編集 削除
特攻隊長まるるう  2005-08-29 18:40:30  No: 91862  IP: [192.*.*.*]

…全然分からん(TT)
Call ってのが Cells の間違いとかは…まぁいいとして、
実際に i にどんな値を入れたときに
A.Address としてどんな範囲が返ってきてて
R1C1 形式で Column の数値を求めるのに
何がどう上手くいかないのか具体的に説明して下さい。

編集 削除
はじめて質問します  2005-08-29 22:09:19  No: 91863  IP: [192.*.*.*]

説明が下手なのでソースを張ります
logMageStart = 1            
Do Until 0 = InStr(logMageStart, strMageCall, "[")              
  logMageStart = InStr(logMageStart, strMageCall, "[")
  logMageEnd = InStr(logMageStart, strMageCall, "]") - logMageStart 
  logMagehenkan = strMageCall
  logMagehenkan = Mid(logMagehenkan, logMageStart, logMageEnd)
  logMagehenkan = Replace(logMagehenkan, "[", "")
  logMageCallNo = CLng(logMagehenkan) + 1
                
  xlsNewSheet.Cells(1, i).ColumnWidth _ 
  = (xlsNewSheet.Cells(1,i).ColumnWidth) _
  + (xlsFromat.Cells(logFitrowNo, logMageCallNo).ColumnWidth)

  logMageStart = logMageStart + 1
Loop
って感じなんですが・・・・
どうも文字を取ってセルを指定するのが力技なのでいやなんですよね
もっとコンパクトにやる方法ってないですかね?
よろしくお願いします

編集 削除
特攻隊長まるるう  2005-08-30 09:27:03  No: 91864  IP: [192.*.*.*]

とりあえず、関係ないところから。
変数に使ってる
  Mage → Merge
  Call → Cell(s)
はスペルミス?知っててやってるなら
他人が見た時に混乱するからやめた方が
いいです。
変数の接頭詞 log は Lng(Long) と紛らわしいので微妙。

本題。
MergeArea のヘルプに書いてあるけど、
戻り値は Range です。つまり質問は
[Excel VBA]
  Dim A As Excel.Range
  Set A = Sheets("Sheet1").Range("$B$3").MergeArea
  Debug.Print A.Address
で、A の範囲が $B$2:$E$6 と出力された時、カラムの番号
  B → 2
  E → 5
を求めたい。現状は
  Dim S As String
  S = A.Address(ReferenceStyle:=xlR1C1,RowAbsolute:=True,ColumnAbsolute:=False)
ColumnAbsolute:=False を設定する事で R1C1 形式のアドレスに
大括弧("["と"]")がつく事を利用して InStr で大括弧を探して
求めている。

…と言ってくれれば伝わります。
[サンプルプログラム]
Sub Test()
  Dim A As Excel.Range
  Dim S As String
  
  Set A = Range("$A$3")
  Debug.Print A.Address
  S = A.Address(ReferenceStyle:=xlR1C1, RowAbsolute:=True, ColumnAbsolute:=False)
  Debug.Print S
  Debug.Print A.Column & " , " & (A.Column + A.Columns.Count - 1)
  Debug.Print ""
  
  Set A = Range("$D$100:$K$200")
  Debug.Print A.Address
  S = A.Address(ReferenceStyle:=xlR1C1, RowAbsolute:=True, ColumnAbsolute:=False)
  Debug.Print S
  Debug.Print A.Column & " , " & (A.Column + A.Columns.Count - 1)
  Debug.Print ""
End Sub
[出力]
>$A$3
>R3C
>1 , 1
>
>$D$100:$K$200
>R100C[3]:R200C[10]
>4 , 11
>

編集 削除
ぶひ  2005-09-13 15:23:56  No: 91865  IP: [192.*.*.*]

ColumnWidthは指定した範囲内のセル一つ一つの列幅を
変更するものです。
マージした列幅を変えるならWidthを使用しないと幅は変更されませんよ。

編集 削除