○第39回目 エクセルのファイルを分析する(その4-2)
前回で取り上げたテーマの"横見出しを取得(マクロ)"の詳細です。
横見出しを、"B;1月 C;2月 D;3月 E;4月 F;5月 G;6月 H;上半期小計"のように取得するというものです。タブのだしかたははよくわかりませんので、"////"にしておきます。後で置換えしてください。
横見出しを指定した後、マクロを動かすという前提です。
ここで考えなければならないのは、横見出し行は複数行あるということと、中には結合セルの場合があるということです。結合セルの場合は、見出しは一番左端のセルに入っています。他のセルは空白です。結合セルの場合、単に見出しをつなげるだけではまずいので、そのときは間を"_"でつなぎます。セルの中で改行している場合は、どのようなものが取れるのでしょうか。この点は無視します。
パターン分けを考えますと(三行の場合)、単純、一行目がセルの結合・二行目以下は単純、一行目はセルの結合・二行目もセルの結合・三つ目は単純、一行目は単純・二行目もセルの結合・三つ目は単純。
それではセルが結合されているかどうかの判定。
If Cells(j, i).MergeCells then
実は、さらに結合されていてデータが入っているかをきくべきなので、実際は、
If Cells(j, i).MergeCells And Cells(j, i) = "" Then
となります。
データが入っているところまで、列をさかのぼりますので、iのところをマイナス1していきます。しかし、横見出しで設定した範囲を越えてはいけませんので、その制限をつけます。
後は組立てです。
座標の取得は、第33回の'座標の取得を参照です。
横見出しの
開始列 retu1
開始行 gyo1
終了列 retu9
終了行 gyo9
行数 gyo_m_cnt
列数 retu_cnt
となっています。
列記号と列番号の対応のために処理は、第26回参照。
r_no(i);列記号
以上のことを基にして、横見出しを結合して配列変数に入れていってみましょう。単純ケースを想定します。二重のfor文になります。
For i = 1 To retu_m_cnt
mm(i) = r_no(retu1+i-1) & ";"
For j = 1 To gyo_m_cnt
mm(i) = mm(i) & cells(gyo1+j-1,retu1+i-1)
Next j
Next i
これを結合します。
For i = 1 To retu_m_cnt
y_midashi = y_midashi & mm(i)& "////"
Next i
これを特定のセルに張付けます。この場合セルの座標が問題になりますので、支障のないところに張付けて、クリップボードに貼り付けまで行います。
Cells(65536, 1) = y_midashi
Cells(65536, 1).Select
Selection.Copy
処理後に、テキストに張付けら得れるかどうかまで確かめてください。
後はセルが結合セルだった場合の処理です。
For j = 1 To gyo_m_cnt
mm(i) = mm(i) & cells(gyo1+j-1,retu1+i-1)
Next j
の部分を変えます。
For j = 1 To gyo_m_cnt
if cells(gyo1+j-1,retu1+i-1).MergeCells And cells(gyo1+j-1,retu1+i-1) = "" Then
for k =1 to i-1 step 1
if cells(gyo1+j-1,retu1+i-1-k).MergeCells And cells(gyo1+j-1,retu1+i-1-k) <> "" Then
if gyo1+j-1 = gyo1 then
mm(i) = mm(i) & cells(gyo1+j-1,retu1+i-1-k)
else
mm(i) = mm(i) & "_" & cells(gyo1+j-1,retu1+i-1-k)
end if
end if
Next k
else
mm(i) = mm(i) & cells(gyo1+j-1,retu1+i-1)
end if
Next j
こんなもんでしょうかね。
2007年9月5日水曜日
登録:
コメントの投稿 (Atom)

0 件のコメント:
コメントを投稿