[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『セル結合を多用した表のなかでの検索と判断』(もんもん)
いつもお世話になっております。 セルの結合を多く用いた表の中から特定の文字列を探して、その隣のセルの内容に よって処理を分ける方法を教えてください。
例えば、4列4行ずつ、あるいは4列2行ずつセルを結合した表があるとします。 下記の状態で、A1,E1,E3はそれぞれ表題です。 また、A5,A9,A11…の値はそれぞれ、0A,0B,0C…と決まっています。 データはE5以降に入っています。
同様の形式で複数の表(1シートに1つ)があるのですが、なかにはデータがない ものもあります。そのような表は、その後の処理を飛ばしたいのです。 「データがない表」という条件は、E5とE7のどちらかまたは両方に「以下余白」または 「BLANK」の文字がある、あるいは両方とも空白である、ことです。
┌──┬──────┬ │A1 │E1(表題2) │ │(表 ├──────┼ │題1)│E3(表題3) │ ├──┼──────┼ │ │E5 │ │A5 ├──────┼ │ │E7 │ ├──┼──────┼ │ │E9 │ │A9 ├──────┼ │ │E11 │ ├──┼──────┼
困っているのは、たまに結合のしかたが少し異なる表があることです。 例えば、A列だけ結合から除外してあったりするとE5はF5になってしまいます。
方法として考えたのは、表題1から0Aと0Bの縦並びを見つけて(0Aだけではデータ 内容と重複する恐れがあるため)、そのとき0Aが入っていたセルの右隣の上半分と 下半分のセルの内容を調べるということです。 表題1の下のセルの右隣というのもありますが、その表題もITEM No.やbセったりします。
他にも方法があるかとおもいます。 どのようにVBAを作ればいいのでしょうか? 教えてください。よろしくお願いします。 (WindowsXP, Excel 2003)
>例えば、A列だけ結合から除外してあったりするとE5はF5になってしまいます。
A列が結合からはずされている場合、なぜ E5がF5になるのか、その因果関係がわからないなぁ・・ それと、「例えば」ということは、そのほかのケースもありうる? もしそうなら、人間が目で見て判断するしかないねぇ。「例えば」のケースを全て特定して列挙してくれれば 考えることもできるけど。
結合云々の前に、E5になったりF5になったり(あるいはそれ以外)ということは、あるシートがあって 入力担当者によって、ある項目をE5に書いたりF5に書いたり、あるいはそれ以外に書いたりしていて それをVBAでチェックしたいといっているのと同じなので。
もう1つ。本来はエクセルを最大限に活用しようとすれば、1レコード1行が「原則」で、 その形でメンテされているものを「見栄えをよくするために」アップされたフォーマットに加工するというのが たぶん望ましい方法なんだろうね。 まぁ、そうはいっても、客先から送られてきたブックで、依頼しても要求を聞いてくれないケースは 多いんだろうけど。
あぁ、それと、セルが結合されているシートって扱いにくいので、どんな処理をするかにもよるけど このシートをコピーして複製シートをつくって、そのシートの結合をはずして、そこで処理するという ことも考えられるかもね。
(ぶらっと)
わかりにくくてすみません。
> A列が結合からはずされている場合、 例えば、A列は結合されていなくて、B1〜E4で結合されている場合ということです。 その場合、表題3の下をクリックするとF5になると思います。
例えばばかりで申し訳ありませんが、複数の人が何年も前からファイルをコピーしたり 修正したりして作成し続けている表なので、今から形式を変えることはできないのです。
最終的な目的としては、複数のファイルの複数のシートにある表を一気にプリントアウトしたい のです。ただしデータが入っていない表は印刷したくないのです。
セルE5とE7の値を調べるVBAで印刷したものと、調べずにすべて印刷した後で目視でデータの ない表を除けたものと比較したところ、枚数に違いがありました。 調べた結果、あるファイルの表の結合の状態が他と異なるため、E5とE7が空白とみなされて しまい印刷されなかったのです。
目視でデータのない表を除ける作業は簡単ですが、枚数が多いと時間もかかるし 間違いの恐れもあるので、自動的にできるといいなと思ったのですが・・・ (もんもん)
う〜ん・・「例えば」ではねぇ・・・ それにかわる、「確かなルール」はあるのかな? ・2行ずつの結合は「例えば」ではなく「絶対」 ・だからチェックするセルは5行目と7行目、これは「絶対」 ・チェックする列は、「その行」に最初にあらわれる「列結合セルの右」、これは「絶対」 とか。
上記だったら、以下、参考コード。
Sub Test() Dim z As Long Dim j As Long Dim myCol As Long Dim ck1 As String Dim ck2 As String
If Range("A1").CurrentRegion.Rows.Count < 5 Then MsgBox "データはないよ〜" Exit Sub End If
For j = 1 To Cells(5, Columns.Count).End(xlToLeft).Column If Cells(5, j).MergeCells And Cells(5, j).MergeArea.Columns.Count = 1 Then myCol = j Exit For End If Next
If myCol = 0 Then MsgBox "表題2,3用の列はないよ〜" Exit Sub End If
ck1 = Cells(5, myCol).Value ck2 = Cells(7, myCol).Value
MsgBox "チェックすべきセルの値は、きっと " & ck1 & " と " & ck2 & " なんじゃないかな?"
End Sub
(ぶらっと)
↑でも結果は出るだろうけど、ちょっと「おばか」なところがあったので訂正して再掲。
Sub Test2() Dim z As Long Dim j As Long Dim myCol As Long Dim ck1 As String Dim ck2 As String
If Range("A1").CurrentRegion.Rows.Count < 5 Then MsgBox "データはないよ〜" Exit Sub End If
For j = 1 To Cells(5, Columns.Count).End(xlToLeft).Column If Cells(5, j).MergeCells Then myCol = j + Cells(5, j).MergeArea.Columns.Count Exit For End If Next
If myCol = 0 Then MsgBox "表題2,3用の列はないよ〜" Exit Sub End If
ck1 = Cells(5, myCol).Value ck2 = Cells(7, myCol).Value
MsgBox "チェックすべきセルの値は、きっと " & ck1 & " と " & ck2 & " なんじゃないかな?"
End Sub
(ぶらっと)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.