[[20111020082648]] 『セル結合を多用した表のなかでの検索と判断』(もんもん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セル結合を多用した表のなかでの検索と判断』(もんもん)
 いつもお世話になっております。
 セルの結合を多く用いた表の中から特定の文字列を探して、その隣のセルの内容に
 よって処理を分ける方法を教えてください。

 例えば、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.