[[20150914090339]] 『他のブックからVBAでデータ抽出する方法』(Lila) ページの最後に飛ぶ

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

 

『他のブックからVBAでデータ抽出する方法』(Lila)

以下のような表を作成したいのですが、元データからA列の品番と、F列からの
クッキー>プレーン>5枚>袋 のように紐付けをして使用数を抽出したいです。
ですが、新しいものが出るたびに前へ列追加(F列から追加していく)していくスタイルになっています。

この場合、VBAで書き出しセルの指定が出来ないと思うのですが、どうでしょうか?
VBAで出来るという場合はコードのヒントを下さい。
その他の解決法がありましたらご教示ください。
よろしくお願いします。

<結果を出したいブック>       ↓(新規の商品は前へ追加していく)
  A   B  C    D   E   F G  H  I  J K L M
1 品番 品目 品名 英語品名         クッキー
2                   プレーン     チョコ
3                  5枚  10枚   5枚  10枚
4                  箱 袋 箱 袋 箱 袋 箱 袋
5 M123 ○○ ○○ ○○
6 E201 △  △  △



<元データブック>
 ・・・ D E F G H I J K L M N O P Q ・・・  V  W  X  Y  Z  AA  AB  AC  AD  AE
3 F列からN列まで品番が9列のどこか1箇所に番号が入っている※O列にコピーして抽出しやすくしました。
4                                      クッキー
5                              プレーン           チョコ
6 3行目〜10行目まで項目                  5枚   10枚      5枚    10枚
7                             箱 袋  箱 袋    箱 袋   箱 袋 
8
9
10
11 M153                           0 5  0  0     1  2  3  4 ←使用数              
12 11行目から下にデータが入っている(変更があった時は随時変更が入ったり、下へ追加されていく)   



<欲しい結果>
  A   B  C    D   E   F G  H  I  J K L M
1 品番 品目 品名 英語品名         クッキー
2                   プレーン     チョコ
3                  5枚  10枚   5枚  10枚
4                  箱 袋 箱 袋 箱 袋 箱 袋
5 M123 ○○ ○○ ○○       2  0  0 4 3 2 0 1 12  ←ここの使用数を抽出したい
6 E201 △  △  △        0  1  2 3 0 0 1 0 0



< 使用 Excel:Excel2013、使用 OS:Windows7 >


 >>この場合、VBAで書き出しセルの指定が出来ないと思うのですが、どうでしょうか? 

 それはなんとでもなると思いますが、それには、各シートの関係をもう少し整理していただくとありがたいです。

 アップされたイメージは、<抽出シート> <データシート> <欲しい結果> の3つですが、3枚のシート?
 それとも、2枚のシート?

 >>元データからA列の品番と、F列からの  クッキー>プレーン>5枚>袋 のように紐付けをして使用数を抽出したいです。 

 この 元データ というのは、どのことですか?
 で、それを、どのシートのどこに展開したいのですか?

 とりようによって、そのあたりの解釈がいろいろあるので。

(β) 2015/09/14(月) 12:11


>アップされたイメージは、<抽出シート> <データシート> <欲しい結果> の3つですが、3枚のシート?
>それとも、2枚のシート?

2枚のブックです。
抽出シートのあるブックとデータシートのあるブックです。
抽出というか結果シートになりますね。ちょっとややこしくなってしまっていたので、修正しますね!

>この 元データ というのは、どのことですか?
>で、それを、どのシートのどこに展開したいのですか?

元データは「データシートのブック」です。
そして「結果シートのブック」に展開したいです。
(Lila) 2015/09/14(月) 12:37


 結果シートのレイアウトは以下で間違いないですか?
 また、どこか結合セルがあるということはないですか?

    |[A] |[B] |[C] |[D]     |[E]|[F]     |[G]|[H] |[I]|[J]   |[K]|[L] |[M]
 [1]|品番|品目|品名|英語品名|   |クッキー|   |    |   |      |   |    |   
 [2]|    |    |    |        |   |プレーン|   |    |   |チョコ|   |    |   
 [3]|    |    |    |        |   |5枚     |   |10枚|   |5枚   |   |10枚|   
 [4]|    |    |    |        |   |箱      |袋 |箱  |袋 |箱    |袋 |箱  |袋 
 [5]|M123|○○|○○|○○    |   |        |   |    |   |      |   |    |   
 [6]|E201|△  |△  |△      |   |        |   |    |   |      |   |    |   

 で、元データシートですけど、レイアウトがわかりづらいですね。
 上のように説明いただけるとわかりやすいです。

 上のレイアウトは

[[20110209184943]] 『[談]シートレイアウトの投稿どうしてますか?』(momo)

 で momoさんが提示してくださったユーティリティを使って作成しています。

(β) 2015/09/14(月) 13:12


こんな便利なものを作って下さった方が居られるのですね!
利用させていただいて、作ってみました。

<結果ブックシート>

    |[A]         |[B]            |[C]            |[D]              |[E]|[F] |[G]|[H]|[I]|[J]|[K]|[L]|[M]|[N] | [O]| [P]| [Q]| [R]| [S]|[T]・・・
 [1]|            |               |               |                 |   |     クッキー       |      Bクッキー         |   
 [2]|品番        |品目           |品名           |英語品名         |   |   プレーン  |  チョコ   |プレーン |   チョコ        |   
 [3]|            |               |               |                 |   |  5枚  | 10枚 |  5枚  | 10枚 |5枚 |10枚|5枚 |10枚|15枚|20枚|   
 [4]|            |               |               |                 |   |袋 |箱 |袋 |箱 |袋 |箱 |袋 |箱 |袋 |袋  |袋  |袋  |袋  |袋  |
 [5]|*E023550    |○○       |○○       |○○         |   |    |   |   |   |   |   |   |   |    |    |    |    |    |    |
 [6]|*IP035782   |△△           |△△           |△△             |   |    |   |   |   |   |   |   |   |    |    |    |    |    |    |

<データブックシート>

     |[D]|[E]   |[F]    |[G]|[H]|[I]|[J]|[K]|[L]|[M]|[N]|[O]    |[P] |[Q]               |[R] |[S]|[T]|[U]|[V]|[W]|[X]|[Y]|[Z] |[AA]|[AB]|[AC]|[AD]|[AE]|[AF]|[AG]|・・・[BA]
 [3] |No.|レベル|                   品番                        |    |                  |    |   |   |   |   |   |   |   |    |    |    |    |    |    |    |    |
 [4] |   |      |                                               |    |                  |       クッキー      |      Bクッキー      |  |  |
 [5] |   |      |                               |    |                  |  プレーン  |  チョコ   |プレーン |   チョコ      |区分|ユニット|
 [6] |   |      |                               |    |                  |  5枚 | 10枚 | 5枚 | 10枚 |5枚 |10枚|5枚 |10枚|15枚|20枚|  |  |
 [7] |   |      |                               |    |                  |袋 |箱 |袋 |箱 |袋 |箱 |袋 |箱 |袋 |袋  |袋  |袋  |袋  |袋  |  |  |
 [8] |   |      |                               |    |品名              |    |   |   |   |   |   |   |   |    |    |    |    |    |    |    |    |
 [9] |   |      |      0|  1|  2|  3|  4|  5|  6|  7|  8|       |    |                  |    |   |   |   |   |   |   |   |    |    |    |    |    |    |    |    |
 [10]|   |      |       |   |   |   |   |   |   |   |   |       |    |                  |    |   |   |   |   |   |   |   |    |    |    |    |    |    |    |    |
 [11]|  1|     0|A002354|   |   |   |   |   |   |   |   |A002354|  00|○○        |   1|   |   |   |   |   |   |   |    |    |   1|   2|    |    |    |    |
 [12]|  2|     0|V024852|   |   |   |   |   |   |   |   |V024852|  00|△△        |    |  1|   |   |   |   |   |   |    |   2|    |    |   3|    |    |    |
 [13]|  3|     0|BFD1548|   |   |   |   |   |   |   |   |BFD1548|  00|××              |    |   |  1|   |   |   |   |   |   1|    |    |    |    |    |    |    |

こうです。
結合セルは区切りの棒をなくしてみましたが、これでレイアウト大丈夫でしょうか?
(Lila) 2015/09/14(月) 13:48


 ありがとうございます。
 レイアウトはよくわかりました。これから要件を読んでみます。

(β) 2015/09/14(月) 14:02


すみません。
よろしくお願いします。
(Lila) 2015/09/14(月) 14:08

 要件をざっと読みました。

 1.まず、レイアウトですが、データシートのF〜Nのどこかに1つ品番がある、それをわかりやすいように O列においた ということですね。
  アップされたサンプルでは、11行目が A002345 --> A021701 と違った品番になっていますけど、これは単なる間違いですね。
   また、P列の 00 は、E列の レベルと同じもの?

 2.同じくデータシートですが、4〜7行目、これは、あらかじめセットされていると考えていいのですね?
  (サンプルでは Y列までですが、最初の説明では AE列まである?)

 3.各商品の階層は、すべての商品が、大項目(クッキー等)の下に中項目(プレーン等)が2つ、れぞれの中項目が属性として枚数を1つ、袋と箱という情報を1つずつ持つ
  という理解でいいですか? それとも商品によって、中項目が1つだったり3つだったりしますか?また、それぞれの中には 袋や箱の他に、3つ目、4つ目の荷姿もありうる?

 4.結果シートですが、品番が *E023550 とか *IP035782 となっていて、データシートの品番とは異なりますが、気にしなくてもいいですね?
  また、先頭の * には何か意味があるのですか? それとも気にしなくてもいいのですか?

 5.アップされたサンプルは M列までのクッキー1種類ですが、【追加があればF列から挿入追加】のようですね。追加されたものも、あらかじめ、記載されていると考えていいですね?
  

 ★ところで、お悩みの書きだしの位置とは、アップされたレイアウトでいえば、どこのことですか?

(β) 2015/09/14(月) 14:50


>1.まず、レイアウトですが、データシートのF〜Nのどこかに1つ品番がある、それをわかりやすいように O列においた ということですね。
  アップされたサンプルでは、11行目が A002345 --> A021701 と違った品番になっていますけど、これは単なる間違いですね。
 また、P列の 00 は、E列の レベルと同じもの?

その通りです。(O列と品番が違うのはミスです)
E列とP列は違うものですが、今回関係のない場所なので、気にされなくても大丈夫です。

>2.同じくデータシートですが、4〜7行目、これは、あらかじめセットされていると考えていいのですね?
 (サンプルでは Y列までですが、最初の説明では AE列まである?)

そうですね。
ひとつの商品につき使用材料データがひとつあると考えて下さい。
サンプルの商品は大項目が二つあるので、実際はAE列まであります。

>3.各商品の階層は、すべての商品が、大項目(クッキー等)の下に中項目(プレーン等)が2つ、れぞれの中項目が属性として枚数を1つ、袋と箱という情報を1つずつ持つ
という理解でいいですか? それとも商品によって、中項目が1つだったり3つだったりしますか?また、それぞれの中には 袋や箱の他に、3つ目、4つ目の荷姿もありうる?

後者になります。
現段階で私の入手しているサンプルでは、レイアウトサンプルのものが最大ではあります。
が、1つのものももちろんありますし、3つや4つの場合もあります。(レイアウトサンプル品にも、使用しなくなった項目があったので、それがあれば4つだったり3つだったりしていました)

>4.結果シートですが、品番が *E023550 とか *IP035782 となっていて、データシートの品番とは異なりますが、気にしなくてもいいですね?
 また、先頭の * には何か意味があるのですか? それとも気にしなくてもいいのですか?

先頭の「*」も含めての品番になります。
結果シートの品番は、データブックシートのものも含め、全部の品番が入力されている為です。(実際は1万5千行以上あります)

>5.アップされたサンプルは M列までのクッキー1種類ですが、【追加があればF列から挿入追加】のようですね。追加されたものも、あらかじめ、記載されていると考えていいですね?

現在はS列の小項目(S4)まで記載しています。
N〜S列は、同じクッキーですが、大きさが違うというような商品になります。

>★ところで、お悩みの書きだしの位置とは、アップされたレイアウトでいえば、どこのことですか?

「結果ブックシート」のF5セルになります。
けれど、新規品をF列から挿入追加がある為、追加列数づつ右に移動していくので、書き出しのセル指定が出来ないなと思い、今回質問させていただいています。
(Lila) 2015/09/14(月) 15:18


 >>サンプルの商品は大項目が二つあるので、実際はAE列まであります

 同じような構成の商品だとすれば、AG列まであるのでは?
 いずれにしても、4行目のデータは、一番右に文字列があるその結合セル領域までということですね。

 >>後者になります。 

 ちょっとしびれますけど了解です。
 たとえば 4行目が aaaaa 、5行目が xxxx と yyyy と zzzz 、xxxx には袋と箱、yyyy には袋だけ、zzzz は 袋 と ケース  と 缶 なんてものがあるということですね?

 >>新規品をF列から挿入追加がある為、追加列数づつ右に移動していくので、書き出しのセル指定が出来ないなと思い

 今考えている処理構造は、データシートの「すべて」の情報を使って、結果シートを、「作り直そう」と考えています。
 結果シートのどこに数値を反映するかは、データシートの4〜7行目の値をキーとして(もちろん、結合セルの場合は、その一番左のセルの値を使います)
 結果シートの、1〜4行目のそれとマッチングして決定します。

 コードを書き始めますので、早めに、↑の確認をお願いしますね。

(β) 2015/09/14(月) 15:48


>いずれにしても、4行目のデータは、一番右に文字列があるその結合セル領域までということですね。

そうですね。
そうなります。

> たとえば 4行目が aaaaa 、5行目が xxxx と yyyy と zzzz 、xxxx には袋と箱、yyyy には袋だけ、zzzz は 袋 と ケース  と 缶 なんてものがあるということですね?

はい。
そういう事になります!

VBA初心者なので、どうなるのかまったく想像が出来ませんが、お願いいたします。
もうこの箇所で1週間近く悩んでいました・・・。

※データブックシートの記述がある部分までレイアウト修正しました。
使用するのは、品番と項目名と使用数のデータのみになります。
(Lila) 2015/09/14(月) 16:01


 レイアウト、わかりやすくなりました。

 ところで、急に不安・・・

 今回の処理は、データブックのシートの情報【だけで】結果シートを作成するのでしょうか?
 あるいは、結果シートには、あらかじめA列の品番や 1行目〜4行目のタイトル部分が記載されており
 データブックにある品番のみを商品のカテゴリー(仮称)に応じて、結果シートのしかるべきところに
 転記するのでしょうか?

 後者だと思っているのですが?

 前者ならロジックは、ほとんど不要で、単に切り貼りだけでOKになりますから。

(β) 2015/09/14(月) 17:29


ええとですね…結果シートブックのA列からD列は、また別のブックから抽出しています。
ボタンを置き、更新があった場合そこを押すと更新されるというマクロを組んでいます。
ですので、A列からD列にはすでにデータがある(データの順番が入れ替わる可能性や、追加更新が随時行われるようになっています)
ですので、データブックからは品番や項目から検索した「使用数」(レイアウトで言うと、データブックシートのR11〜AEのデータが入っている最終行まで、という事になります。

(Lila) 2015/09/14(月) 23:34


 とりあえず書きました。
 データシートに存在する品番に対する結果シートの品番行の「すべての列」の値をデータシートの当該品番の登録から「置換」
 もし、処理時点で、データシートにはない、せんべい なんかが結果シートにすでに存在し、そこに数値があっても
 データシートにはないので、空白で置き換えられます。
 そういったセルは、触らないでほしいということであれば、それはそれで対応できますが。

 急な用事が入り、今週、あまり時間がとれないかもしれません。
 (というか、金曜日まで、ネット利用が困難になりそう。できるだけ、のぞいてみますが、対応遅れたらごめんなさいということで)

 結果シートのブックをマクロブックにしています。
 ★のところは、実際のものに。とりあえず、データブックと結果ブック、両方を開いたうえで処理。
 これも、データブックをダイアログで選択させるとか、複数のデータブックを同じフォルダに格納しておいて
 それらをすべて、結果ブックに反映させるということもできますが、まずは、このバージョンで試してみてください。

 Sub Sample()
    Dim shF As Worksheet
    Dim shT As Worksheet
    Dim mxCol As Long
    Dim mxRow As Long
    Dim k1 As String
    Dim k2 As String
    Dim k3 As String
    Dim k4 As String
    Dim dicH As Object
    Dim dicC As Object
    Dim dicD As Object
    Dim dicA As Object
    Dim c As Range
    Dim comF As Range
    Dim comT As Range
    Dim r As Range
    Dim n As Range
    Dim k As Variant
    Dim com As Variant
    Dim x As Long

    Application.ScreenUpdating = False                              '処理中の画面の動きを隠す

    Set dicC = CreateObject("Scripting.Dictionary")                 'データシート列タイトル辞書(列番号がキー) 作業用
    Set dicD = CreateObject("Scripting.Dictionary")                 'データシート辞書 品番+列タイトル で数値を格納
    Set dicA = CreateObject("Scripting.Dictionary")                 'データシート辞書 品番登録

    'データシート処理
    Set shF = Workbooks("元ブック.xlsx").Sheets("データシート")     '★
    mxCol = shF.Cells(4, Columns.Count).End(xlToLeft).Column        'データシートの4行目のデータ最終列を求める
    mxCol = mxCol + shF.Cells(4, mxCol).MergeArea.Columns.Count - 1 'そのセルの結合セルの列数を加味して、表の最終列を求める

    For Each c In shF.Range("R4", shF.Cells(4, mxCol))   '4行目のセルを1つずつ取り出す
        If Not IsEmpty(c) Then k1 = c.Value                         '4行目キー
        If Not IsEmpty(c.Offset(1)) Then k2 = c.Offset(1).Value     '5行目キー
        If Not IsEmpty(c.Offset(2)) Then k3 = c.Offset(2).Value     '6行目キー
        If Not IsEmpty(c.Offset(3)) Then k4 = c.Offset(3).Value     '7行目キー
        dicC(c.Column) = k1 & vbTab & k2 & vbTab & k3 & vbTab & k4  '列番号を見出しに、その列タイトルを辞書登録
    Next

    Set comF = shF.Range("O11", shF.Range("O" & Rows.Count).End(xlUp)).Resize(, mxCol - Columns("O").Column + 1)     'データシートの品番領域

    For Each r In comF.Rows  '品番行の取り出し
        com = r.Cells(1).Value  '品番
        dicA(com) = True                                        '品番登録
        For Each c In r.Offset(, 3).Resize(, r.Columns.Count - 3).Cells  'その行から数量セルを取り出す
            If Not IsEmpty(c) Then  'もし数値があれば
                k = dicC(c.Column)  '列タイトル
                '辞書に品番+品名列タイトルをキーにして数値を登録
                dicD(com & vbTab & k) = dicD(com & vbTab & k) + Val(c.Value)
            End If
        Next
    Next

    '結果シート処理

    Set shT = ThisWorkbook.Sheets("結果シート")                     '★
    Set dicH = CreateObject("Scripting.Dictionary")                 '結果シート列タイトル辞書(列タイトルがキー)
    mxCol = shT.Cells(4, Columns.Count).End(xlToLeft).Column        '結果シートの1行目のデータ最終列を求める
    mxCol = mxCol + shT.Cells(4, mxCol).MergeArea.Columns.Count - 1 'そのセルの結合セルの列数を加味して、表の最終列を求める
    k1 = ""
    k2 = ""
    k3 = ""
    k4 = ""

    For Each c In shT.Range("F1", shT.Cells(1, mxCol))   '1行目のセルを1つずつ取り出す
        If Not IsEmpty(c) Then k1 = c.Value                         '1行目キー
        If Not IsEmpty(c.Offset(1)) Then k2 = c.Offset(1).Value     '2行目キー
        If Not IsEmpty(c.Offset(2)) Then k3 = c.Offset(2).Value     '3行目キー
        If Not IsEmpty(c.Offset(3)) Then k4 = c.Offset(3).Value     '4行目キー
        dicH(c.Column) = k1 & vbTab & k2 & vbTab & k3 & vbTab & k4  '列番号を見出しに、その列タイトルを辞書登録
    Next

    Set comT = shT.Range("A5", shT.Range("A" & Rows.Count).End(xlUp))     '結果シートの品番領域

    For Each r In comT.Rows                     'データシートの品番行取り出し
        com = r(1).Value                        '品番
        If dicA.exists(com) Then                                    'もしデータシートにあれば
            With r.Offset(, 5).Resize(, mxCol - 5)                  '当該行の転記領域
                For Each c In .Cells                                'セルを取り出し
                    c.Value = dicD(com & vbTab & dicH(c.Column))    'データシート数値で置換
                Next
            End With
        End If
    Next

    Application.ScreenUpdating = True

    MsgBox "処理が終了しました"

 End Sub

(β) 2015/09/15(火) 07:31


ありがとうございます!
そうすると、別のデータシートブックを見に行ったときには、その前に登録されていたものが消えてしまうということでしょうか?
最後の下の方のデータシート数値で置換の箇所をどうにかすればそれは解消されますか?

>複数のデータブックを同じフォルダに格納
データブックが大量なので、出来ればこの方法が良いのですが、データブックのレイアウトがそれぞれ違うときにこの方法は取れないですか?

ご丁寧にありがとうございます><
はい、急ぎではないので大丈夫ですよ!
質問ばかりですみません・・・;
大変勉強になっています!
(Lila) 2015/09/15(火) 08:26


 >最後の下の方のデータシート数値で置換の箇所をどうにかすればそれは解消されますか? 

 下のほうにある

 c.Value = dicD(com & vbTab & dicH(c.Column))    'データシート数値で置換

 これを

 If dicD.exists(com & vbTab & dicH(c.Column)) Then c.Value = dicD(com & vbTab & dicH(c.Column))    'もし、データシートに当該列タイトルがあれば置換

 にすればOKです。

 >>データブックが大量なので、出来ればこの方法が良いのですが、データブックのレイアウトがそれぞれ違うときにこの方法は取れないですか? 

 レイアウトというのが、たとえば クッキー等の開始列が異なるとか、品番開始行が異なるとか 等であれば
 不可能ですが、それさえ同じであれば(たとえば あるデータブックにはAクッキー、Bクッキー、あるデータブックにはクッキーとXクッキーとYクッキー) ということであれば大丈夫です。

(β) 2015/09/15(火) 08:41


ありがとうございます!
変更してみます!

変更前のマクロを実行してみました所、

> If Not IsEmpty(c) Then k1 = c.Value '4行目キー

ここの

> k1 = c.Value

この部分で「実行エラー13 型が一致しません」というエラーが出てしまいました。
型というのは、最初の変数宣言の事でしょうか・・・?
「k1」には、ちゃんと値が格納されているようなのですが、「c.Value」でエラーが出ているみたいです。
「c.Value」のところにマウスを置くと「c.Value = エラー2023」というのが見えます。

それと、このキー配列で、5行目キーの「k2」にもちゃんと値が格納されているのが見えるのですが、6行目、7行目キーの「k3」「k4」にはその列に書かれていない「M0」という値が格納されているようなのですが、その前段階で上記のエラーが発生してしまっているので、そこは問題ないでしょうか?

>レイアウトというのが、たとえば クッキー等の開始列が異なるとか、品番開始行が異なるとか 等であれば不可能ですが、

開始列が異なるので、合うようにレイアウトを修正するか、ひとつひとつマクロの修正を行うしかないという事ですね^^;

(Lila) 2015/09/15(火) 08:57



>> k1 = c.Value
この部分で「実行エラー13 型が一致しません」というエラーが出てしまいました。
型というのは、最初の変数宣言の事でしょうか・・・?
「k1」には、ちゃんと値が格納されているようなのですが、「c.Value」でエラーが出ているみたいです。
「c.Value」のところにマウスを置くと「c.Value = エラー2023」というのが見えます。

これは、データブックの「BD」列にエラーの出た計算式が入っていた為でした。

最後の「処理が終了しました」のポップまで出たので、動いているようなのですが、結果ブックシートには何も転記されていません。
データブックのシートには、結果ブックのシートと同じ品番が入っていること、そこに値がある事は確認したので、やはり

>それと、このキー配列で、5行目キーの「k2」にもちゃんと値が格納されているのが見えるのですが、6行目、7行目キーの「k3」「k4」にはその列に書かれていない「M0」という値が格納されているようなのですが、その前段階で上記のエラーが発生してしまっているので、そこは問題ないでしょうか?

が原因でしょうか?
(Lila) 2015/09/15(火) 11:37


βさんすみません。
最初に気付けばよかったのですが、データブックのレイアウトがばらばらなのが問題なので、それぞれのブックに新しくシートを作成し(仮にシート名は同一に「Sheet1」とする)そのシートを所定の位置(例えば既存シートの一番最初なら一番最初という風に)に置き、レイアウトを下記のように統一すれば、同一のフォルダに入れておいた場合の大量処理というのが出来るでしょうか?
そして大項目中項目小項目がひとつづつしかないBデータブックのようなものもこういうレイアウトで統一すれば同一フォルダ内でのマクロ実行は可能になりますでしょうか。

<Aデータブック新規シート仮定>

    |[A]         |[B] |[C]|[D]|[E]|[F]|[G]|[H]|[I]|[J] |[K] |[L] |[M] |[N] | [O]| [P]・・・
 [1]|            |     クッキー       |      Bクッキー         |   
 [2]|品番        |   プレーン  |  チョコ   |プレーン |   チョコ        |   
 [3]|            |  5枚  | 10枚 |  5枚  | 10枚 |5枚 |10枚|5枚 |10枚|15枚|20枚|   
 [4]|            |袋 |箱 |袋 |箱 |袋 |箱 |袋 |箱 |袋 |袋  |袋  |袋  |袋  |袋  |
 [5]|*E023550    |    |   |   |   |   |   |   |   |    |    |    |    |    |    |
 [6]|*IP035782   |    |   |   |   |   |   |   |   |    |    |    |    |    |    |

<Bデータブック新規シート仮定>

    |[A]         |[B]  |[C]|・・・
 [1]|            |飴  |  |   
 [2]|品番        |ぶどう|  |   
 [3]|            |のど飴|  |   
 [4]|            |袋  |   |
 [5]|*E023550    |     |   |
 [6]|*IP035782   |     |   |
(Lila) 2015/09/15(火) 13:31

 今、ちょっとネットッを使える環境で閲覧のみですけど、拝見しました。
 (明日、夕方には、エクセルも使える環境に移動予定です)

 まず、13 型が一致しません は、セルにエラー値が存在するのが理由ですね。
 これが、運用上 ありうるということであれば、そこをスキップするという手は取れえます。

 で、レイアウトですけど

 データシート

 4〜7行目のR列から右に4階層の情報がある。大項目の下にいくつ中期項目があるか、中項目の下にいくつ小項目があるか
 小項目の下にいくつの荷姿があるか、それは自由です。もちろん、大項目によってばらばらということもOK。
 O11から下に品番があり、 各行に R列から右に、それぞれの列に応じたその数値情報がある。 

 もちろん、結果シートのF列からの項目の並びと違っていてもOK。

 で、これらが違うとできないかというと、面倒ですができます。
 人間なら目で見て、あぁ、ここから項目が始まっているなとか、品番がはじまっているな、ということはわかりますよね。
 何かしらの判断条件が頭の中にあってそれを目で見て判断できるわけです。
 ですから、その 何かしらの判断条件をあらかじめきめていただくことができれば、それをVBAで判断しますから
 レイアウトの異なるデータシートであっても統合が可能になります。

 ところで、アップしたコード、何も考えず、とにかくゴリゴリ、力技で書きなぐった結果、無駄なところも多いですし
 なんだか、わかりづらいところもあります。

 申し少し整理したものにしたいと思っています。

(β) 2015/09/16(水) 16:33


 もし

 (Lila) 2015/09/15(火) 13:31

 この提示のレイアウトにできれば、もちろん、VBAとしては、ずっと楽ちんになります。
 でも、

 (β) 2015/09/16(水) 16:33 でもうしあげたこともできなくはないです。

(β) 2015/09/16(水) 16:45


βさん、お忙しいところありがとうございます!

元データから自分のローカルに落としてきているもの(実際の運用もそうするつもりです)なので、計算式は消して動かしてみたのですが、両方に同じ品番があり、データシートには値も入っているのに書き出されていなかったのです。
計算式も、何のためのものか私も入社したばかりなのでわからず、必ずしも入っているわけでもなさそうなので、スキップするという箇所はいらないのかなぁと思いました。(もちろんスキップできれば、もしいくつかのブックでそういう箇所があった場合はとても助かるとは思います)

なるほど・・・βさんのおっしゃりたい事はなんとなく理解できました!

提示のレイアウトにした方が楽になるであろう事は明白ですが、いま手元にあるサンプルデータブックは6つ程度なので修正も可能かと思いますが(昨日、このレイアウトを思いついてからネットで調べて書こうと奮闘しています)、実際の運用となると、それこそいくつデータブックがあるか判りません・・・。
ひとつひとつレイアウトチェックとマクロで抽出という作業に気が遠くなりそうな気はします・・・。

βさんの提案してくださった事ができたら、それが一番良いのかなというのが正直なところです。
お手数おかけしますが、引き続きお願いしても宜しいでしょうか・・・。
(Lila) 2015/09/16(水) 16:56


 データシートの以下の要件、必ずしも同じ場所ではない場合、その特定方法はありますか?

 項目行 4〜7行目 変動あるとすれば、何か目印はありますか? 目で見て判断する場合は何を頼りにしますか?

 同様で、O列の品番、R列からの項目、これらも目で見て判断する場合は何を頼りにしますか?

(β) 2015/09/16(水) 19:44


 もう1つ。

 現在のデータブック特定処理ではなく選択処理にするとして

 1.フォルダ選択ダイアログでフォルダを選び、その中のブックをすべてデータブックとして取り込む
 2.ファイル選択ダイアログで、ブック(1つでも複数でも)を選び、それらを対象にする。

 どちらがいいですか。

(β) 2015/09/16(水) 23:20


 もう1つ忘れてました。

 O列の品番、R列からの項目 開始行も変動するなら、その見極めルールも教えてください。

(β) 2015/09/16(水) 23:54


βさん、いつもありがとうございます。
目視ですとやはり「品番」「数量」(こちらレイアウトで何故か抜けておりましたので、再度下へ貼り付けておきました)などでしょうか。
サンプルをもうひとつ貼り付けてみました。
「品番」は8列(データシートブック1のようにO列がある場合は別ですが、基本的にはデータシートブック2のようなものが多いです(ですが開始列はバラバラ)とりあえずサンプルでもらっている6ブックはすべて「品番」項目の一番最初(データシートブック1ではO列があったので、そこへ。データブックシート2のようになっているものは品番項目の開始列(サンプルの場合だと「H列」)へ寄せてあります(一度セルを結合し、結合解除の作業をしています)
「項目」はデータシートブック1のように数列使用していることもあれば、2のように1列、もしくは2列などの場合もあるので「数量」で判断しています。

>2.ファイル選択ダイアログで、ブック(1つでも複数でも)を選び、それらを対象にする。

品番が少なくとも週1、多いときで週4で更新されることがあるので、1も捨てがたくはありますが、データシートは月1〜2あるか無いかくらいなので、1も捨てがたくはありますが、こちらでお願いしたいです。

恐らく今回の質問に全て回答したかと思いますが、抜けている情報などありましたら、また答えさせていただきます。
よろしくおねがいします><

<データシートブック1>

    |[D]|[E]   |[F]    |[G]|[H]|[I]|[J]|[K]|[L]|[M]|[N]|[O]    |[P] |[Q]               |[R] |[S]|[T]|[U]|[V]|[W]|[X]|[Y]|[Z] |[AA]|[AB]|[AC]|[AD]|[AE]|[AF]|[AG]|・・・[BA]
 [3] |No.|レベル|                   品番                        |    |                  |                数量              |    |    |
 [4] |   |      |                                               |    |                  |       クッキー      |      Bクッキー      |  |  |
 [5] |   |      |                               |    |                  |  プレーン  |  チョコ   |プレーン |   チョコ      |区分|ユニット|
 [6] |   |      |                               |    |                  |  5枚 | 10枚 | 5枚 | 10枚 |5枚 |10枚|5枚 |10枚|15枚|20枚|  |  |
 [7] |   |      |                               |    |                  |袋 |箱 |袋 |箱 |袋 |箱 |袋 |箱 |袋 |袋  |袋  |袋  |袋  |袋  |  |  |
 [8] |   |      |                               |    |品名              |    |   |   |   |   |   |   |   |    |    |    |    |    |    |    |    |
 [9] |   |      |      0|  1|  2|  3|  4|  5|  6|  7|  8|       |    |                  |    |   |   |   |   |   |   |   |    |    |    |    |    |    |    |    |
 [10]|   |      |       |   |   |   |   |   |   |   |   |       |    |                  |    |   |   |   |   |   |   |   |    |    |    |    |    |    |    |    |
 [11]|  1|     0|A002354|   |   |   |   |   |   |   |   |A002354|  00|○○        |   1|   |   |   |   |   |   |   |    |    |   1|   2|    |    |    |    |
 [12]|  2|     0|V024852|   |   |   |   |   |   |   |   |V024852|  00|△△        |    |  1|   |   |   |   |   |   |    |   2|    |    |   3|    |    |    |
 [13]|  3|     0|BFD1548|   |   |   |   |   |   |   |   |BFD1548|  00|××              |    |   |  1|   |   |   |   |   |   1|    |    |    |    |    |    |    |

<データシートブック2>

    |[B]|[C]   |[D]     |[E]     |[F]|[G] |[H]    |[I]|[J]|[K]|[L]|[M]|[N]|[O]|[P]|[Q] |[R]                                |[S]     |[T]       |[U]・・・[AB]
 [3] |   |      |        |        |   |    |品番   |   |   |   |   |   |   |   |   |版数|品名                               |数量    |          |   
 [4] |   |      |        |        |   |    |       |   |   |   |   |   |   |   |   |    |                                   |せんべい|     |←廃盤になったもの等入っていることも(取り消し線が入力されている)   
 [5] |   |      |        |        |   |    |       |   |   |   |   |   |   |   |   |    |                                   |しょうゆ|     |   
 [6] |No.|種類  |変更箇所|変更内容|   |レベル|      0|  1|  2|  3|  4|  5|  6|  7|  8|    |                                   |        |     |   
 [7] |   |      |        |        |   |    |       |   |   |   |   |   |   |   |   |    |                                   |        |          |   
 [8] |   |      |        |        |  1|   0|M009993|   |   |   |   |   |   |   |   |4 3 |○○                          |       1|         0|   
 [9] |   |○○AB|        |        |  2|   0|M011095|   |   |   |   |   |   |   |   |2 1|△△                |       0|         1|   
 [10]|   |共通  |        |        |  3|   1|M513069|   |   |   |   |   |   |   |   |1 0|●●                            |       1|         1|   

(Lila) 2015/09/17(木) 09:03


 1.サンプルの1も2も、項目は4行目〜7行目ですが、これは固定とみていいですか?それとも、甘い?
   固定であれば、3行目の「数量」を頼りにして項目開始列の判断ができます。
   固定でなくても、行の上のほうから見ていって「数量」があるところは探せますが。

 2.品番列も、同様に 「品番」を3行目 ないしは、うえから見ていって「品番」が見つかったところでさがせますね。
   もちろん、3行目固定であれば楽です。

 3.品番開始行は、品番列で、最初に値があるところで決められたらいいなと思ったんですが、サンプル2のように、その前にレベル 0 があるんですよね。
   なので 0 は 空白扱いにすれば、なんとか開始行は判断できます。それでいいですか?

 4.廃盤ですかぁ! 取り消し線はどこに入っているのですか? 一番大きな大項目(クッキーとかBクッキーとか)ですか?
   それとも大項目はいきているけど、その中のいくつかの中項目が廃盤というのもあり??

 5.サンプル2のT4が空白ですね。どう解釈したらいいですか?

 6.項目の階層はMAX4でいいですね?

(β) 2015/09/17(木) 11:58


>1.サンプルの1も2も、項目は4行目〜7行目ですが、これは固定とみていいですか?それとも、甘い?
   固定であれば、3行目の「数量」を頼りにして項目開始列の判断ができます。
   固定でなくても、行の上のほうから見ていって「数量」があるところは探せますが。

複数シートのものが1シートになったりしているものもあったりするので、必ずしも4〜7行目ではないですね・・・。

> 2.品番列も、同様に 「品番」を3行目 ないしは、うえから見ていって「品番」が見つかったところでさがせますね。

   もちろん、3行目固定であれば楽です。

こちらも上記と同様です。

> 3.品番開始行は、品番列で、最初に値があるところで決められたらいいなと思ったんですが、サンプル2のように、その前にレベル 0 があるんですよね。

   なので 0 は 空白扱いにすれば、なんとか開始行は判断できます。それでいいですか?

そうですね・・・レベルは品番開始列の前の列で、値の入っている一番上は、いま手元にあるものは全て「0」で始まっていますので、そこは空白扱いに出来るかと思います。

> 4.廃盤ですかぁ! 取り消し線はどこに入っているのですか? 一番大きな大項目(クッキーとかBクッキーとか)ですか?

   それとも大項目はいきているけど、その中のいくつかの中項目が廃盤というのもあり??

前者の場合もありますが、後者の場合もあります。
例えば、「箱」が廃盤になっていて、値に取り消し線が引かれ列がグレーアウトにされていたり、中項目がまるまる廃盤になり、中項目に取り消し線が入っていたりします。

> 5.サンプル2のT4が空白ですね。どう解釈したらいいですか?

丁度そのT4に廃盤のものが入っていて、取り消し線が引かれている(中項目)ものが入っていました。
どう書いておけばいいのか判らなかったので、横に「←廃盤に〜」コメントのように入れていました。

> 6.項目の階層はMAX4でいいですね?

そうですね、階層のMAXは4で大丈夫です。

ひとつのセルに「Alt+Enter」で大項目と小項目(中項目がないもの)が入力されているものは、別けた方が良いでしょうか?
(Lila) 2015/09/17(木) 13:41


 う〜ん・・・・

 想像ですけど、現在の各データブック、これは、マクロでの自動処理にはむいていないというか、
 マクロでの自動処理を考えるなら、基本的にはレイアウトは統一してもらう、ということが第一歩のような気がします。
 いろいろ事情があって、レイアウトはブックごとに【ずれる】としても、あくまで【ずれる】のであって
 データブックをつくる人それぞれで、目で見て判断ができればいいというレイアウトであれば、マクロを作ったとしても

 ・そのマチマチのレイアウトを処理するためのレイアウト判定ロジックがきわめて複雑に、かつ膨大になる。
 ・なによりも、そうしてロジック化しても、きっとロジックが対応していない形でデータブックをつくる人がでてきて正しい集計ができない。

 そうなるような気がします。

 なによりも、(Lila)さん自身が、あまり、そう感じておられないように思えて心配です。

 >>複数シートのものが1シートになったりしているものもあったりするので、必ずしも4〜7行目ではないですね

 ちょっと意味がわからないのですが、これは、もしかしたら、同じブックのシート内でも、この行が異なる場合があるということでしょうか?
 もし、そうであれば、これは、無理と考えてください。

 >>・レベルは品番開始列の前の列で、値の入っている一番上は、いま手元にあるものは全て「0」で始まっていますので、そこは空白扱いに出来るかと思います。 

 品番開始列の前の列? というのがよくわかりませんが、いずれにしても 【今手元にあるもの】といわれていることが心配です。
 きっと、そのうちに、【私はそんなルールで作っていない、勝手に判断するな】という人がでてきますよ。
 やはり、ここは、関係者とともに、しっかりとレイアウトを規定する作業からはいられたほうがよろしいかと。

 >>前者の場合もありますが、後者の場合もあります。 

 これは、そうかぁ・・・というところで、でもなんとか対処はできるかなとも思うのですが
 たとえば中項目が廃盤になっていれば、その下に紐付いて記載されているものすべてが廃盤と考えていいのですか?
 (廃盤が 箱 であれば、その箱だけが廃盤ですけど)

 >>どう書いておけばいいのか判らなかったので、横に「←廃盤に〜」コメントのように入れていました。 

 了解です。

 >>ひとつのセルに「Alt+Enter」で大項目と小項目(中項目がないもの)が入力されているものは、別けた方が良いでしょうか?

 まず

 プレーン
 5枚

 といったものが、人によっては、1つのセルに セル内改行で記載していることもあるというのは【絶対にNG】です。
 もちろん、これも、ロジックをゴリゴリ(というかゴテゴテ)、時間さえかければコードを書き上げることはできますが
 それはやりたくないです。

 >>それと、【中項目がない】というのが非常に気になります。

 クッキー
 空白
 5枚

 こんな感じですか?これは、そういうものであれば、(必要なら)対応できます。

 ★いずれにしても、【かなりの限定版】としてコードを、これから考えながら書いてみますが、
  【システム化】作業の第一歩は、【仕様の統一】です。日常の各自の運用を変更してもらうわけですから
  抵抗は大きいと思いますが、本件の自動処理ができるかどうかは、ひとえに(Lila)さんの努力にかかっていますよ。

(β) 2015/09/17(木) 14:32


βさんのおっしゃるとおり、レイアウトが統一化されていないので、私も困っていたところなのです。
こんな統一性のないレイアウトでは関数でひとつづつ引っ張るしか無いのでは・・・と考えていました。

派遣の身ですし、私がどうこうできるような大きさの会社でもないですし、この処理を頼んできた人に、まずレイアウトから統一するべきだというお話は何度もしているのですが・・・(運用は私の所属している部署のみの運用です)
元データを作成している部署がまた違うところなので、話も届かないのですよね・・・
そもそも、派遣なので自分の所属部署意外は何をしているのか同じオフィスに居ても知らされていないくらいなので・・・。

私も研修でだけで実務経験はないのですが、Javaプログラミングは少しだけかじっているので、この問題が非常に面倒なことだと言うことは理解しております。
βさんには何度お礼を言っても足りないくらいです。

> ちょっと意味がわからないのですが、これは、もしかしたら、同じブックのシート内でも、この行が異なる場合があるということでしょうか?

 もし、そうであれば、これは、無理と考えてください。

やはり、元のレイアウトをひとつひとつ手直しして、以前上げたようにするのが一番なのかなぁと考えています。
とりあえず、1シートになっているものは、構成表のみ別シートに移してみました。

>品番開始列の前の列?

データシートブック1で言うと開始列が「F」なので、「E」列というように、必ず前の列にあります。

> たとえば中項目が廃盤になっていれば、その下に紐付いて記載されているものすべてが廃盤と考えていいのですか?

そうですね、中項目で廃盤になっているものは、そのまま紐付いている小項目から下も廃盤になります。

>プレーン

 5枚
といったものが、人によっては、1つのセルに セル内改行で記載していることもあるというのは【絶対にNG】です。

了解です。
こういうものは、修正をかけようと思います。

>クッキー

 空白
 5枚

そうです。
物によっては、1種類(大項目のみ)しかないものや、その1種類の類似品(クッキー>箱、袋)のようなものがあったりします。

>いずれにしても、【かなりの限定版】としてコードを、これから考えながら書いてみますが、

ありがとうございます。
お忙しい中、大変申し訳ないです・・・。
よろしくおねがいします。
(Lila) 2015/09/17(木) 15:30


 お立場、お察しします。

 以下のスペックで、とりあえず書いてみました。
 どこまで、現行の状態でつかえるのか、あるいは使えないのか、心もとないですが。

 品番列 シートの上のほうに最初に現れる"品番"という文字が入ったセルの列を品番列とします。
 そのセルが結合セルであれば、その最初のセルの列にします。
 アップされたサンプルでいえば、1がF列、2がH列。1がO列ではなくなるのが心配です。
 ここは「レベル0」の品番? これが具合悪ければ、結合セルの場合は、その最後のセルの列ということもできます。(そうすればO列になります)

 項目列 シートの上のほうに最初に現れる "数量"という文字が入ったセルの列を項目開始列とします。ここも結合セルなら(基本的に結合セルですが)
 その最初のセルの列にします。
 アップされたサンプルでいえば1がR列、2がS列になります。

 項目開始行 見つかった"数量"がある行の次の行を開始行とします。項目は、すべて4階層(空白OK)としています。
 アップされたサンプルでいえば1、2とも 4行目になります。

 なお、"品番"がある行と "数量" がある行は同じ行であることをチェックしています。(異なっていればメッセージを出して処理スキップ)

 品番開始行 みつかった"品目"の列のデータ最終行が品目の終わりとしますが、そのセルから上にみていってデータが存在する最後の行を品番開始行とします。
 アップされたサンプルでいえば、1が11行目、2が8行目になります。
 ★最初の品番の上には少なくとも1つ、空白セルがあるという前提です。

 ある項目のある階層に、取り消し線(部分取り消し線含む)があればその下の階層すべてを廃盤として扱います。

 なお、関連領域に式によるエラー値、定数としてのエラー値があれば、メッセージを出して処理をスキップします。

 コードですが、アップした、ちょっとおバカなコードを整理したんですが、それに今回の追加が入ったので全体的にわかりにくくなっているかもです。

 アップ済みの処理を、サブプロシジャ化して、データシートを、引数としてそれに与えて処理させるようにしました。
 プロシジャ名を データ取り込み としています。

 これを動かすメイン処理を2つ用意しました。Test1は、ファイル選択ダイアログから対象ブックを1つないし、複数選んで処理します。
 Test2 は フォルダ選択ダイアログから、対象フォルダを選んで処理します。選ばれたフォルダのすべてのブックが対象ブックです。
 必要に応じて使い分けてください。

 Test1,Test2,データ取り込みの ★マークのシート名は実際のものにしておいてください。

 さぁ、どうなりますやら。まずは試して、思惑が異なれば指摘願います。

 Sub Test1()
    Dim sel As Variant
    Dim f As Variant
    Dim wb As Workbook

    Application.ScreenUpdating = False

    sel = Application.GetOpenFilename("ExcelBook,*.xlsx", Title:="対象ファイルを選んでください", MultiSelect:=True)
    If Not IsArray(sel) Then Exit Sub   'キャンセルボタン

    For Each f In sel
        Set wb = Workbooks.Open(f)
        データ取り込み wb.Sheets("データシート")    '★
        wb.Close False
    Next

    Application.ScreenUpdating = True

    MsgBox "処理が終了しました"

 End Sub

 Sub Test2()
    Dim fName As String
    Dim wb As Workbook
    Dim fPath As String

    Application.ScreenUpdating = False

    With Application.FileDialog(msoFileDialogFolderPicker)
        If Not .Show Then Exit Sub  'キャンセルボタン

        fPath = .SelectedItems(1)
        fName = Dir(fPath & "\*.xlsx")

        Do While fName <> ""
            Set wb = Workbooks.Open(fPath & "\" & fName)
            データ取り込み wb.Sheets("データシート")    '★
            wb.Close False
            fName = Dir()
        Loop
    End With

    Application.ScreenUpdating = True

    MsgBox "処理が終了しました"

 End Sub

 Sub データ取り込み(shF As Worksheet)
 '=============================
    Dim comRow As Long
    Dim catRow As Long
    Dim comCol As Long
    Dim catCol As Long
 '=============================
    Dim f As Range
    Dim ok As Boolean
    Dim tmp As Long

    Dim r1 As Range
    Dim r2 As Range
    Dim r3 As Range
    Dim ck1 As Range
    Dim ck2 As Range

    Dim shT As Worksheet
    Dim mxCol As Long
    Dim mxRow As Long
    Dim nCols As Long
    Dim nRows As Long
    Dim vntF As Variant
    Dim vntT As Variant
    Dim k1 As String
    Dim k2 As String
    Dim k3 As String
    Dim k4 As String
    Dim dicX As Object
    Dim dicY As Object
    Dim dicH As Object
    Dim x As Long
    Dim y As Long

    Dim c As Range
    Dim r As Range
    Dim n As Range
    Dim k As Variant
    Dim com As Variant

    'データシート処理

    '=================================='データシートレイアウト規定 開始

    '品番列
    Set f = shF.Cells.Find(What:="品番", LookAt:=xlWhole, SearchOrder:=xlByRows)
    If Not f Is Nothing Then
        comCol = f.Column
        tmp = f.Row
        '数量(項目)列
        Set f = shF.Cells.Find(What:="数量", LookAt:=xlWhole, SearchOrder:=xlByRows)
        If Not f Is Nothing Then
            If f.Row = tmp Then
                catCol = f.Column
                catRow = f.Row + 1
                ok = True
            End If
        End If

    End If

    If Not ok Then
        MsgBox shF.Parent.Name & " のシートに、品番もしくは数量がないか、または同じ行ではないので処理をスキップします"
        Exit Sub
    End If

    mxRow = shF.Cells(Rows.Count, comCol).End(xlUp).Row                     'データシートの品番列最終行番号
    '品番開始行
    comRow = shF.Cells(mxRow, comCol).End(xlUp).Row

    '=================================='データシートレイアウト規定 終了

    nRows = mxRow - comRow + 1                                              'データシートの品番数
    mxCol = shF.Cells(catRow, Columns.Count).End(xlToLeft).Column           'データシートの項目のデータ最終列を求める
    mxCol = mxCol + shF.Cells(catRow, mxCol).MergeArea.Columns.Count - 1    'そのセルの結合セルの列数を加味して、表の最終列を求める
    nCols = mxCol - Columns(catCol).Column + 1                              '表の列数

    mxRow = shF.Cells(Rows.Count, comCol).End(xlUp).Row                     'データシートの品番列最終行番号
    '品番開始行
    comRow = shF.Cells(mxRow, comCol).End(xlUp).Row

    nRows = mxRow - comRow + 1                                              'データシートの品番数

    Set r1 = shF.Cells(comRow, comCol).Resize(nRows)                        '品番領域
    Set r2 = shF.Cells(catRow, catCol).Resize(4, nCols)                     '項目領域
    Set r3 = shF.Cells(comRow, catCol).Resize(nRows, nCols)                 'データ領域

    On Error Resume Next
    Set ck1 = Union(r1, r2, r3).SpecialCells(xlCellTypeFormulas, xlErrors)  '数式によるエラー値
    Set ck2 = Union(r1, r2, r3).SpecialCells(xlCellTypeConstants, xlErrors) '定数によるエラー値
    On Error GoTo 0

    If Not ck1 Is Nothing Or Not ck1 Is Nothing Then
        MsgBox "対象領域にエラー値がありますので " & shF.Parent.Name & " はブックは処理できません"
        Exit Sub
    End If

    Set dicX = CreateObject("Scripting.Dictionary")                  'データシート列タイトル辞書
    Set dicY = CreateObject("Scripting.Dictionary")                  'データシート品番辞書

    vntF = r3.Value                    'データシートのデータ領域を配列に取り込む

    For Each c In r2.Rows(1).Cells                    '項目領域の先頭行のセルを1つずつ取り出す
        If nonStrike(c) Then            '4階層すべてに取り消し線なければ採用
            k1 = c.MergeArea(1).Value                                   '先頭行キー
            k2 = c.Offset(1).MergeArea(1).Value            '2行目キー
            k3 = c.Offset(2).MergeArea(1).Value            '3行目キー
            k4 = c.Offset(3).Value                         '4行目キー
            x = x + 1
            dicX(k1 & vbTab & k2 & vbTab & k3 & vbTab & k4) = x         '列タイトルを見出しに配列内列番号を登録
        End If
    Next

    For Each c In r1                    '品番の取り出し
        y = y + 1
        dicY(c.Value) = y                                           '品番を見出しに配列内行番号を登録
    Next

    '結果シート処理

    Set shT = ThisWorkbook.Sheets("結果シート")                     '★

    Set dicH = CreateObject("Scripting.Dictionary")                 '結果シート列タイトル辞書

    mxCol = shT.Cells(4, Columns.Count).End(xlToLeft).Column        '結果シートの1行目のデータ最終列を求める
    mxCol = mxCol + shT.Cells(4, mxCol).MergeArea.Columns.Count - 1 'そのセルの結合セルの列数を加味して、表の最終列を求める
    mxRow = shT.Range("A" & Rows.Count).End(xlUp).Row               '結果シートの品番最終行
    nRows = mxRow - 4                                               '結果シートの品番数

    k1 = ""
    k2 = ""
    k3 = ""
    k4 = ""

    For Each c In shT.Range("F1").Resize(, nCols)           '1行目のセルを1つずつ取り出す
        k1 = c.MergeArea(1).Value                                   '先頭行キー
        k2 = c.Offset(1).MergeArea(1).Value            '2行目キー
        k3 = c.Offset(2).MergeArea(1).Value            '3行目キー
        k4 = c.Offset(3).Value                         '4行目キー
        dicH(c.Column) = k1 & vbTab & k2 & vbTab & k3 & vbTab & k4  '列番号を見出しに、その列タイトルを辞書登録
    Next

    vntT = shT.Range("F5").Resize(nRows, nCols).Value             '結果シートのデータ領域を配列に格納
    y = 0

    For Each r In shT.Range("A5").Resize(nRows)                    'データシートの品番取り出し
        y = y + 1
        x = 0
        com = r(1).Value                        '品番
        If dicY.exists(com) Then                                    '品番がデータシートにあれば
            For Each c In Range("F5").Offset(y - 1).Resize(, nCols)
                x = x + 1
                If dicX.exists(dicH(c.Column)) Then                     '項目キーがデータシートにあれば
                    vntT(y, x) = vntF(dicY(com), dicX(dicH(c.Column)))  '上書き
                End If
            Next
        End If
    Next

    '更新済み配列からセルに一括転記
    shT.Range("F5").Resize(UBound(vntT, 1), UBound(vntT, 2)).Value = vntT

 End Sub

 Private Function nonStrike(c As Range) As Boolean
    If c.MergeArea(1).Font.Strikethrough = False Then
        If c.Offset(1).MergeArea(1).Font.Strikethrough = False Then
            If c.Offset(2).MergeArea(1).Font.Strikethrough = False Then
                If c.Offset(3).Font.Strikethrough = False Then nonStrike = True
            End If
        End If
    End If
 End Function

(β) 2015/09/17(木) 16:31


βさん、まずはありがとうございます><

早速、動かしてみたのですが、まず test1 の方で、「コンパイルエラー:プロパティの使い方が不正です。」と表示され、「Sub」の箇所が黄色で→表示されてしまいました。

test2 の方は、参照のダイアログはポップしたのですが、ファイルがないと言われてしまいました。

複雑なコードなので、ぱっと見ただけでは判らないので、また自分でもコードがどうなっているのか追って見ますが、まずは動作のご報告をさせて頂きました><
(Lila) 2015/09/17(木) 17:06


 >>test1 の方で、「コンパイルエラー:プロパティの使い方が不正です。」

 えっ? こちらでは、コンパイルエラーにはならずに実行されますが?

 >>test2 の方は、参照のダイアログはポップしたのですが、ファイルがないと言われてしまいました

 バージョンは 2013 と書いておられたので、対象ブックは xlsx にしています。
 もしかして、対象ブックは xls互換ブックですか? そうであれば

 fName = Dir(fPath & "\*.xlsx")

 これを 

 fName = Dir(fPath & "\*.xls")

 ないしは

 fName = Dir(fPath & "\*.xls*")

 に変更してみてください。

 それと、実行には影響がありませんが、レイアウト規定ブロックに、下のほうからコード移植した際に
 したのほうのコードもそのまま残していました。

 データシートレイアウト規定 終了 とコメントを入れたところから5行ぐらい下の

    mxRow = shF.Cells(Rows.Count, comCol).End(xlUp).Row                     'データシートの品番列最終行番号
    '品番開始行
    comRow = shF.Cells(mxRow, comCol).End(xlUp).Row

 この3行は不要です。

(β) 2015/09/17(木) 17:51


 プロパティの不正の件、黄色く光るのは Sub のところですが、実際のおかしなプロパティ記述は
 青くなっているはずです。 どの行のどのプロパティでしたか?

(β) 2015/09/17(木) 17:56


>test1のコンパイルエラー

こちら、は恐らく、私の入力ミスかと思われます。
>データ取り込み wb.Sheets("Sheet1") '★シート名変更
この箇所で、「データ取り込み」と「wb.」の間にスペースを入れるのを忘れていました。
お騒がせしました;

エクセルブックは「xlsx」です。
test1の方では、ダイアログに表示されていましたが、やはりtest2の方では表示されないですね・・・。

test1の方、全処理完了するのですが、やはりデータシートで値の入っている箇所があるのにも関わらず、入ってこないようです・・・。
ブレークポイントを設定してキーに値格納箇所を見てみたのですが、何も拾っていない?のでしょうか・・・
「k1 = ""」のようになってしまいます。
データシートブック1のもので見たものが値取得していなかったのですが、他のサンプルで動作させてみたところ、キーに値が格納されているのを確認しました。
そのまま最後まで処理させてみたのですが、やはり値が出力されません・・・。

どういった原因が考えられますでしょうか?
よろしくお願いします。
(Lila) 2015/09/18(金) 08:47


 まず Test2 これはファイルは表示しません。あくまで、フォルダを選択する処理です。
 で、選択されたフォルダの中のすべての xlsx ブックを対象ブックとしてすべて抽出して処理します。

 データが反映しない件、こちらで、いくつかのレイアウトパターンで試して反映していますので
 コードが想定しているレイアウト要件と実際のものが異なるんでしょうね。

 たとえば k1 は大項目結合セルの一番左側のセルの値なんですが、ここが空白ということは
 そこに値がないか、そのセルの場所の判定が間違っているか、どちらかですね。

 ためしに、その場所に MsgBox c.MergeArea(1).Address といれて、正しいセルになっているかどうかを
 確認していただけますか?

(β) 2015/09/18(金) 11:02


>まず Test2 これはファイルは表示しません。

なるほどです!
フォルダで選択できました!

>データが反映しない件、こちらで、いくつかのレイアウトパターンで試して反映していますので

 コードが想定しているレイアウト要件と実際のものが異なるんでしょうね。

うーん・・・なるほど・・・
掲示したレイアウトサンプルに数個合わせてみて、もう一度実行してみます。

>たとえば k1 は大項目結合セルの一番左側のセルの値なんですが、ここが空白ということは

 そこに値がないか、そのセルの場所の判定が間違っているか、どちらかですね。

こちらで掲示した最初の「データシートブック」のレイアウトのものの時のみ値を見にいけてないのですよね・・・。
でも、キー1〜4は「結果シートブック」の項目欄の値ですよね??あれ、違いますか??
だとしたら、どうしてそのブック選択したときのみ入らないのか、謎です・・・。

> ためしに、その場所に MsgBox c.MergeArea(1).Address といれて、正しいセルになっているかどうかを

 確認していただけますか?

ええと、こちらは、「k1 = 」の後を変更してみればいいということでしょうか?
(Lila) 2015/09/18(金) 11:23


 項目階層のキーの取得はデータシートならびに結果シートそれぞれで行っています。

 >>ええと、こちらは、「k1 = 」の後を変更してみればいいということでしょうか?

 はい、2か所ありますので、それぞれで。【変更】ではなく【追加】してくださいね。

 また、データシートの処理の最初のほうで、r1,r2,r3 の領域を取得していますので、その下あたりに

 MsgBox r1.Address(External:=True) & vblf & r2.Address(External:=True) & vblf & r3.Address(External:=True)

 といったものを追加して、読みこんだデータシートのレイアウトとマクロが認識している領域の比較確認をするのも
 有効だと思います。

(β) 2015/09/18(金) 11:55


βさんすみません;
初歩的な事かもしれないのですが、調べてみても原因がわからないので教えてください。

>k1 = MsgBox c.MergeArea(1).Address

としてみたのですが、「c.」の部分でコンパイルエラーが発生し「補正候補:ステートメントの最後」というエラーが出てきてしまいました。(k1 = MsgBox c.MergeArea(1).Address が赤く表示されています)

変更はこういうことではなかったのでしょうか・・・?
(Lila) 2015/09/18(金) 12:25


 変更というか追加をお願いしたのは

 k1 = ・・・・
 k2 = ・・・・

 といったものがある、その前に(k1 = ・・・・ の前の行に)

 MsgBox c.MergeArea(1).Address

 を1行追加という意味です。

(β) 2015/09/18(金) 13:02


ああ!すいません;
追加部分見落としていました・・・。

出力された結果が以下でした。

<データブックシート>
F11~F1297
V4~AI7
V11~AI1297

だったので、選択範囲は合っているようです。

そして、
>MsgBox r1.Address(External:=True) & vblf & r2.Address(External:=True) & vblf & r3.Address(External:=True)
をコメントにし実行してみた所、出力されたのが

F1
V4

でした。
S4までは入力してありますが、
T、U、V列は空白になっています。
ですので、これが原因でしょうか?

(Lila) 2015/09/18(金) 13:12


 >>F11~F1297 
 >>V4~AI7 
 >>V11~AI1297 

 これは
 MsgBox r1.Address(External:=True) & vblf & r2.Address(External:=True) & vblf & r3.Address(External:=True) 
 で表示されたものですね。うん、きっとあっているようですね。

 次の F1 や V4 がわからないのですが、これは MsgBox c.MergeArea(1).Address で表示されたものが
 最初は F1 で、ループ処理でのその次の表示が V4 だったということでしょうか?
 もし、そうであれば ?? ですねぇ。この例でいえば c は V4,W4,X4,Y4,・・・・とAI4 までが表示されるはずなので。

 ところで k1 の値が "" だったというのは、もしかしてステップ実行等で、
 k1 = c.MergeArea(1).Value                                   
 ここに来た時の k1 の値ではないですか?
 もしそうであれば、k1 にはまだ値がセットされないタイミングですから、最初は "" ですし、2回目以降は前の値が入っています。
 F8 をおして、このコードを実行して、k2 = c.Offset(1).MergeArea(1).Value が黄色く光ったタイミングで
 k1 の値をチェックしてもらっていますか?

 あと、

 >>S4までは入力してありますが、 
 >>T、U、V列は空白になっています

 これがわからないですねぇ。
 r2 は V4~AI7 だったんですよね。
 最初の大項目が入っているセル(結合セル)は V4 のはずですが? T,U,V が空白列だという意味は?

(β) 2015/09/18(金) 14:51


>F1
 V4

これは、ループ処理で「F1」が何度か出た後に、「V4」が一度出力されOKボタンを押したら、そこで処理が終了されてしまったようです。

>>>S4までは入力してありますが、

 >>T、U、V列は空白になっています
 これがわからないですねぇ。
 r2 は V4~AI7 だったんですよね。
 最初の大項目が入っているセル(結合セル)は V4 のはずですが? T,U,V が空白列だという意味は?

これは、
> >>F11~F1297

 >>V4~AI7 
 >>V11~AI1297 

の時にセル番号が出る前に「データブックシート」の名前+セル番号で出力されたので、次の「F1」と「V4」の時は何もブックの名前が無かったので、実行したブック(=結果ブックシート)のものが出力されたのかな?と思ったのですが、こちらの方もデータブックシートの方と言うことでしょうか?

> 最初の大項目が入っているセル(結合セル)は V4 のはずですが? T,U,V が空白列だという意味は?

上記の理由から、「結果ブックシート」の値なのかな?と思ったので、T,U、V列は今のところ空白列になっていると言う意味になります。

明日からの連休ですが、家にエクセル環境が古いものしかないので、検証などの結果報告は、来週の木曜以降のお返事になってしまいます。
お力添えいただいているのに、大変申し訳ありません・・・。

(Lila) 2015/09/18(金) 16:41


 >>検証などの結果報告は、来週の木曜以降のお返事になってしまいます

 はい。ゆっくりいきましょう。

 そちらの実際のシートが見えないのがなんとも、もどかしいところですが。

 1.F1,V4 の件

  あぁ、そういうことですね。というか、実際は V4,F1 の順番じゃなかったですか?
  データシートであれば、大項目セルをV4からAI4 までループさせているところのメッセージですから、F1 というアドレスは
   (データシートのレイアウトからは)でないはずです。
   データシートであれば、V4,V4,V4・・・・とでるはずです。(最初の大項目の列数分 V4 がでる)
  で、結果シートの大項目は F1 から始まっていますので、F1,F1,F1 と出ます。

 2.【次の「F1」と「V4」の時は何もブックの名前が無かったので】

   あぁ、そうですね。

   r1,r2,r3アドレス表示には (External:=true) と、ブック、シートも表示するようにしていますが
   c のところは MsgBox c.MergeArea(1).Address としてましたね。
   ここを MsgBox c.MergeArea(1).Address(External:=True) とすれば、ブック名、シート名もでますので、そうして確認願えますか。

 3.k1 や k2 等の値確認のタイミング(""だったと判断したタイミング)については、いかがでしたか?

(β) 2015/09/18(金) 17:13


>はい。ゆっくりいきましょう。
 そちらの実際のシートが見えないのがなんとも、もどかしいところですが。

ありがとうございます><
判る範囲のお返事は出来ますので、そちらは答えて行きたいと思います。

>3.k1 や k2 等の値確認のタイミング(""だったと判断したタイミング)については、いかがでしたか?

すみません、記入し忘れていました。

>dicH(c.Column) = k1 & vbTab & k2 & vbTab & k3 & vbTab & k4 '列番号を見出しに、その列タイトルを辞書登録
ここではもう値が入っているのかなと思い、ここで確認していました。
(Lila) 2015/09/18(金) 17:20


 ここであれば すでに k1,k2,k3,k4 には値が入っていますので、ここで "" なら本当に "" です。
 このあたり、こちらでは発生しないので、ゆっくりと、どうしたら発生するかという方向で、いろいろ試してみます。

(β) 2015/09/18(金) 18:54


 >>dicH(c.Column) = k1 & vbTab & k2 & vbTab & k3 & vbTab & k4 

 ここは、結果シートの処理部分ですね。
 結果シートは固定レイアウトで大項目が F1 から始まるわけですが、結果シートの大項目のセルで、空白値のところはありますか?

 あと基本的なことですが、各データシートの項目階層キー クッキー - プレーン - 5毎 - 箱 といったものと、その品番を
 結果シートの、それと比較しています。
 見た目同じような文字列でも、一方は半角、一方は全角とか、一方は クッキー だけど 一方は クッキー○ (○ はスペース)といったものであれば
 マッチせず、値が転記されないことになります。
 そのあたりも確認いただければ幸甚。

(β) 2015/09/18(金) 19:06


 こちらで、あれこれレイアウトを変更して試行していますが、今のところ、キーが空白になることもありませんし
 データシートの品番・項目キーが結果シートにあれば確実に反映されています。

 そちらで、連休明けにチェックされるときに、もう一度以下を確認願えますか?
 (確認用アドレスの表示は連絡したように External:=True を加えたものでお願いします)

 1.どうも、最初に F1 というのが何回か表示され、そのあと V4 というのがよくわからないところですが
   これは、複数ブック処理で、データシートと結果シートのどちらのメッセージはわかりづらかったとでしょうかねぇ?

 2.データシートの品番列がF列で項目開始列がV列。 もちろん、そういうレイアウトもありでしょうけど、ちょっと離れていますね。
   そのデータシートの V4から始まる結合セル(あるいはV4のみの単一セル)が、大項目の最初で、そこに クッキーとかせんべいとかが
   入っているということで間違いないですね。

 3.フォルダ選択による複数ブック処理ではなく、単一ブック処理でやった場合、すべてのブックが反映されないのですか?
   それとも、反映されるブックもある。反映されないブックもあるということですか?
   後者だとしたら、反映されるブックと反映されないブックに、何か違いはないですか?

(β) 2015/09/21(月) 16:10


おはようございます。

>ここは、結果シートの処理部分ですね。
> 結果シートは固定レイアウトで大項目が F1 から始まるわけですが、結果シートの大項目のセルで、空白値のところはありますか?
> あと基本的なことですが、各データシートの項目階層キー クッキー - プレーン - 5毎 - 箱 といったものと、その品番を
> 結果シートの、それと比較しています。
> 見た目同じような文字列でも、一方は半角、一方は全角とか、一方は クッキー だけど 一方は クッキー○ (○ はスペース)といったものであればマッチせず、値が転記されないことになります。

一応半角やスペースが無いのは確認してみました。
空白項目(というより、セル結合忘れ)を修正してみました。

> そちらで、連休明けにチェックされるときに、もう一度以下を確認願えますか?
> (確認用アドレスの表示は連絡したように External:=True を加えたものでお願いします)

こちら、一文加えて実行してみました。
前回は、F1が最初でV4が後でしたが、βさんのおっしゃっていた通り、V4が先に表示されるようになりました。
前回表示されなかったAD4やN1なども表示されました。(回数は、表示された回数になります)

V4  8回
AD4 7回
結果シートブックのSheet1 F1 9回
結果シートブックのSheet1 N1 7回

>2.データシートの品番列がF列で項目開始列がV列。 もちろん、そういうレイアウトもありでしょうけど、ちょっと離れていますね。

全体レイアウトとしては、D列から始まり、私も何の為の項目なのか全部理解できている訳ではないのですが、
「No(恐らく品番が何個あるかといった数値付け)」「レベル」「品番(F列〜O列まで)」「版数(アップデートをちょくちょくするので恐らくそのバージョン)」「品名」「専/共(R列〜U列)」で、V列から「数値」項目というレイアウトになっています。

>   そのデータシートの V4から始まる結合セル(あるいはV4のみの単一セル)が、大項目の最初で、そこに クッキーとかせんべいとかが
>   入っているということで間違いないですね。

そうですね、それで間違いないです。

>3.フォルダ選択による複数ブック処理ではなく、単一ブック処理でやった場合、すべてのブックが反映されないのですか?
>   それとも、反映されるブックもある。反映されないブックもあるということですか?
>   後者だとしたら、反映されるブックと反映されないブックに、何か違いはないですか?

結果ブックシートの方に、別の項目(クッキーしか入力していなかったので、せんべいなどのほかの項目)を入力して、その数値のあるデータブックでも試してみましたが(こちらはk1などに値格納はされていたのを確認)、結果ブックシートには数値が反映されていない状態でした。

(Lila) 2015/09/24(木) 09:05


以下のレイアウトで試してもらえませんか。

データブック(3行目〜6行目、適宜結合セルになっています。また R5 には取り消し線をいれています)

     |[A]|[B]|[C]|[D]|[E]   |[F]    |[G]|[H]|[I]|[J]|[K]|[L]|[M]|[N]|[O]    |[P]|[Q] |[R]     |[S]|[T] |[U]|[V]   |[W]|[X] |[Y]|[Z]      |[AA]|[AB]  |[AC]|[AD]|[AE]|[AF]|[AG]    
 [1] |   |   |   |   |      |       |   |   |   |   |   |   |   |   |       |   |    |        |   |    |   |      |   |    |   |         |    |      |    |    |    |    |        
 [2] |   |   |   |   |      |       |   |   |   |   |   |   |   |   |       |   |    |        |   |    |   |      |   |    |   |         |    |      |    |    |    |    |        
 [3] |   |   |   |No |レベル|品番   |   |   |   |   |   |   |   |   |       |   |    |数量    |   |    |   |      |   |    |   |         |    |      |    |    |    |    |        
 [4] |   |   |   |   |      |       |   |   |   |   |   |   |   |   |       |   |    |クッキー|   |    |   |      |   |    |   |Bクッキー|    |      |    |    |    |    |        
 [5] |   |   |   |   |      |       |   |   |   |   |   |   |   |   |       |   |    |プレーン|   |    |   |チョコ|   |    |   |プレーン |    |チョコ|    |    |    |区分|ユニット
 [6] |   |   |   |   |      |       |   |   |   |   |   |   |   |   |       |   |    |5枚     |   |10枚|   |5枚   |   |10枚|   |5枚      |10枚|5枚   |10枚|15枚|20枚|    |        
 [7] |   |   |   |   |      |       |   |   |   |   |   |   |   |   |       |   |    |袋      |箱 |袋  |箱 |袋    |箱 |袋  |箱 |袋       |袋  |袋    |袋  |袋  |袋  |    |        
 [8] |   |   |   |   |      |       |   |   |   |   |   |   |   |   |       |   |品名|        |   |    |   |      |   |    |   |         |    |      |    |    |    |    |        
 [9] |   |   |   |   |      |      0|  1|  2|  3|  4|  5|  6|  7|  8|       |   |    |        |   |    |   |      |   |    |   |         |    |      |    |    |    |    |        
 [10]|   |   |   |   |      |       |   |   |   |   |   |   |   |   |       |   |    |        |   |    |   |      |   |    |   |         |    |      |    |    |    |    |        
 [11]|   |   |   |  1|     0|A002345|   |   |   |   |   |   |   |   |A002345|   |    |       1|   |    |   |     5|   |    |   |        9|    |      |    |  13|    |    |        
 [12]|   |   |   |  2|     0|V024852|   |   |   |   |   |   |   |   |V024852|   |    |        |  2|    |  4|      |  6|    |  8|         |  10|      |  12|    |  14|    |        
 [13]|   |   |   |  3|     0|BFD1548|   |   |   |   |   |   |   |   |BFD1548|   |    |        |   |   3|   |      |   |   7|   |         |    |    11|    |    |    |    |        

マクロブック (反映された場所を明確にするために、データ域すべてに a をパディングしています)
また、ユーティリティを使う際に、30行目から配置してしまいました。実際には1行目からで
データブックと同様、1行目〜3行目は、適宜結合セルにしています。

     |[A]     |[B] |[C] |[D]     |[E]|[F]      |[G]   |[H] |[I] |[J]     |[K]|[L] |[M]|[N]   |[O]|[P] |[Q]|[R]      |[S] |[T]   |[U] |[V] |[W] |[X]      |[Y] |[Z]   |[AA]|[AB]|[AC]
 [30]|        |    |    |        |   |Cクッキー|      |    |    |クッキー|   |    |   |      |   |    |   |Bクッキー|    |      |    |    |    |Cクッキー|    |      |    |    |    
 [31]|品番    |品目|品名|英語品名|   |加糖     |      |無糖|    |プレーン|   |    |   |チョコ|   |    |   |プレーン |    |チョコ|    |    |    |プレーン |    |チョコ|    |    |    
 [32]|        |    |    |        |   |5枚      |10枚  |5枚 |10枚|5枚     |   |10枚|   |5枚   |   |10枚|   |5枚      |10枚|5枚   |10枚|15枚|20枚|5枚      |10枚|5枚   |10枚|15枚|20枚
 [33]|        |    |    |        |   |ケース   |ふくろ|小箱|束  |箱      |袋 |箱  |袋 |箱    |袋 |箱  |袋 |袋       |袋  |袋    |袋  |袋  |袋  |袋       |袋  |袋    |袋  |袋  |袋  
 [34]|hoge    |a   |a   |a       |a  |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |a        |a   |a     |a   |a   |a   |a        |a   |a     |a   |a   |a   
 [35]|hogehoge|a   |a   |a       |a  |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |a        |a   |a     |a   |a   |a   |a        |a   |a     |a   |a   |a   
 [36]|A002345 |a   |a   |a       |a  |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |a        |a   |a     |a   |a   |a   |a        |a   |a     |a   |a   |a   
 [37]|V024852 |a   |a   |a       |a  |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |a        |a   |a     |a   |a   |a   |a        |a   |a     |a   |a   |a   
 [38]|BFD1548 |a   |a   |a       |a  |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |a        |a   |a     |a   |a   |a   |a        |a   |a     |a   |a   |a   
 [39]|ABC123  |a   |a   |a       |a  |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |a        |a   |a     |a   |a   |a   |a        |a   |a     |a   |a   |a   
 [40]|ABC234  |a   |a   |a       |a  |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |a        |a   |a     |a   |a   |a   |a        |a   |a     |a   |a   |a   
 [41]|ABC345  |a   |a   |a       |a  |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |a        |a   |a     |a   |a   |a   |a        |a   |a     |a   |a   |a   
(β) 2015/09/24(木) 09:27

βさんの指定レイアウトで試してみた所、数値が入りました。

ブックに寄っての、フォント等の違いも関係ありますか?
(Lila) 2015/09/24(木) 10:35


βさんのレイアウトを使用して別のものも試してみたのですが、値が入らないものは、大項目のみのものが入りませんでした。
レイアウトで言うと、数量の直下、4行目のみ項目があり、5〜7行目が空白セルになっているものです。
(Lila) 2015/09/24(木) 11:24

 >>ブックに寄っての、フォント等の違いも関係ありますか?

 書式の違いは、値には影響しません。
 逆に、新規ブックで
 A1 と A2 に半角大文字の P をいれ、A1 を選択して、書式設定 でFont を WingDings 2 に設定。
 B1 あたりに =A1=A2 と入れると True とでますね。見た目は違うけど、内容(値)は同じなので True になります。

 ただし、見た目は同じだけど、中身が異なる場合は当然マッチしません。

 >>値が入らないものは、大項目のみのものが入りませんでした

 つまり、ここは結合セルにはなっていないということですね。
 それでも大丈夫ですよ。たまたま、その部分のキーが空白というだけですから。
 こちらで確認済みです。
 ただし、データシートがそうなら、結果シートにも、同じような構成の項目がないと、もちろんマッチしませんが。

(β) 2015/09/24(木) 12:49


> ただし、データシートがそうなら、結果シートにも、同じような構成の項目がないと、もちろんマッチしませんが。

例えば、結果シートでは大項目の下に空白セルが3つあるわけですが、データシートで大項目の下の空白セルが2つしかない、となると、マッチしないという解釈で合っていますか?

βさんのレイアウトに合わせてデータシートもR〜U列を削除してみてやってみましたが、やはり値が出力されないので、ちょっと品番数値の方に半角や全角、スペースなど無いか確認してみることにします。
(Lila) 2015/09/24(木) 12:57


 たとえばデータシートが

 ABC
 空白
 空白
 空白

 で、結果シート側が

 ABC
 空白
 空白
 XYZ

 なら、当然マッチしません。4項目のキーの連なりで比較していますので。

 ただ、そういう要件があるなら、そのルールを明確にしていただければ、対応は可能かもしれません。

 >>やはり値が出力されないので

 値が出力されない現象が以下のいずれか教えてください。

 1.結果シート側、パディングした a が、そのまま a 。
 2.結果シート側、 a は消えているけど値が入らず空白になる。

 前者なら、キーそのものがマッチしなかったということになりますし、
 後者ならキーのマッチはされた、でも、そのデータシート側の値が空白だったということになります。

(β) 2015/09/24(木) 13:28


関係あるか無いか判りませんが、データブックシートのいくつかに施されているものなのですが、なんという機能なのかわかりませんが、指定部分のみ表示され(青い線で囲まれていて範囲は必要に応じて広げたり縮めたりできる)、それ以外はグレーアウトになっているのですが、これは値を拾ってこれない事に関係ありますか?

>4項目のキーの連なりで比較していますので。

了解です。

> ただ、そういう要件があるなら、そのルールを明確にしていただければ、対応は可能かもしれません。

あくまでも見た限りではあるのですが、データシートに大項目しかない場合は、その下の空白セルはどれも2つでした。

<大項目のみのデータシート>
ABC
空白
空白

<結果シート>
ABC
空白
空白
空白

というレイアウトになっています。

>1.結果シート側、パディングした a が、そのまま a 。

こちらですね。
ただ、これは上記の空白セルの関係でキーがマッチしていないんだろうという事が判りました。

(Lila) 2015/09/24(木) 13:36


 >>指定部分のみ表示され(青い線で囲まれていて範囲は必要に応じて広げたり縮めたりできる)、
 >>それ以外はグレーアウトになっているのですが、これは値を拾ってこれない事に関係ありますか? 

 当方、エクセル全般に疎いのですが、ユーザー設定のビューですかね。
 いずれにしても、列が非表示になっていようと、行が非表示になっていようと、マクロは問題なく、セルの値を抽出します。

 逆に、表示されている、その右端のさらに右に項目があって、それらは、単に非表示になっているだけだとすると
 見た目には項目がありませんが、マクロは、お構いなしにそこにある値を抽出して処理しますのでご注意を。

 >>データシートに大項目しかない場合は、その下の空白セルはどれも2つでした。 

 まず、ちょっと名前を統一しておきましょう。

 クッキー   これを 大項目と呼びましょう。
 プレーン   これを 中項目と呼びましょう。
 5枚     これを 小項目と呼びましょう。     
 箱      これを 形状 と呼びましょう。

 で、仕様は、あくまで データシートも結果シートも、すべてのデータに、この4項目のキーがあって、そこに数値がある。
 それぞれの項目の中身は ABC でもいいし、空白 でもいいけど、とにかく 大項目から形状まで、4項目のキーがある。

 こうしています。

 どれも2つでしたということは

 クッキー
 空白
 空白
 ●●● 

 この ●●● のセルには何がはいっているのですか?
 品番ごとの数値行が、ここから始まっているということですか?

 この回答次第ですけど。中項目、小項目がともに空白なら、形状も空白だときめつけることはできます。
 でも、そうすると

 クッキー
 空白
 空白
 袋

 このよに、正しく(?)記述されていても、

 クッキー
 空白
 空白
 空白

 とみなされ、結果シートとはマッチしなくなるかもしれませんね。

 どうしましょうか?

(β) 2015/09/24(木) 17:10


βさんお返事が遅くなりすみません><

> クッキー
> 空白
> 空白
> ●●●
この場合、一応●●●部分も空白ではあります。
どのデータブックシートにも、項目の下、数値の始まる上の行はフィルタ用に空白行が1行あります。

> クッキー
> 空白
> 空白
> 袋
このように記述される事はまずないので、「中項目、小項目がともに空白なら、形状も空白」と決め付けてしまっても大丈夫だと思われます。

(Lila) 2015/09/28(月) 08:36


 ちょっと、誤解されたかも。

 データシートが

 大項目 クッキー
 中項目 空白
 小項目 空白
 形状  空白

 なら、

 結果シートの

 大項目 クッキー
 中項目 空白
 小項目 空白
 形状  空白

 には、必ずマッチするはずなんですが?

 >>中項目、小項目がともに空白なら、形状も空白

 と申し上げたのは

 データシートが

 大項目 クッキー
 中項目 空白
 小項目 空白
 形状  hoge

 と記載している人がいて、これを結果シートの

 大項目 クッキー
 中項目 空白
 小項目 空白
 形状  空白

 とマッチさせたいということなら、hoge を強制的に空白扱いにしましょうか ということだったんです。

 もし、形状欄につき、データシートも結果シートも空白なのにマッチしないということなら
 振出に戻って、その原因を追及しなければいけなくなります。
 本当にそうなのですか?

 空白に見えているところ、本当に空白ですか?
 また、もう1つのキーである品番、同じように見えているのでしょうが、本当に同じですか?

 あるセルと別のセルが同値かどうか、その検証は、シートのどこかに

 =結果シートのセル=データシートのセル

 と入れて True が表示されれば同値、False が表示されれば 異なる値。

 このように簡単に検証できますので、確認願います。

(β) 2015/09/28(月) 09:14


このレイアウトでテストしてみたのですが、結果シートの「a」は変化しませんでした。

     |[D]|[E]   |[F]       |[G]|[H]|[I]|[J]|[K]|[L]|[M]|[N]|[O]|[P] |[Q] |[R]     |[S] |[T] |[U]     
 [3] |No |レベル|                     品番                     |版数|品名|数量    |    |区分|ユニット
 [4] |   |      |                                              |    |    |せんべい|もち|    |        
 [5] |   |      |                                              |    |    |        |    |    |        
 [6] |   |      |                                              |    |    |        |    |    |        
 [7] |   |      |                                              |    |    |        |    |    |        
 [8] |   |      |                                              |    |    |        |    |    |        
 [9] |   |      |         0|  1|  2|  3|  4|  5|  6|  7|  8|   |    |    |        |    |    |        
 [10]|   |      |          |   |   |   |   |   |   |   |   |   |    |    |        |    |    |        
 [11]|  1|     0|M009993   |   |   |   |   |   |   |   |   |   |    |    |       1|    |  20|梱包    
 [12]|  2|     0|M011095   |   |   |   |   |   |   |   |   |   |    |    |        |   1|  20|梱包    
 [13]|  3|     0|M513069   |   |   |   |   |   |   |   |   |   |    |    |       1|    |  20|梱包    
 [14]|  4|     0|D3M-01K1-3|   |   |   |   |   |   |   |   |   |    |    |       1|    |    |        
 [15]|  5|     0|M513073   |   |   |   |   |   |   |   |   |   |    |    |        |   1|    |        
 [16]|  6|     0|M602669   |   |   |   |   |   |   |   |   |   |    |    |        |   2|    |        
 [17]|  7|     0|M513074   |   |   |   |   |   |   |   |   |   |    |    |       3|    |    |        
 [18]|  8|     0|M513075   |   |   |   |   |   |   |   |   |   |    |    |        |   5|    |        

実際のデータシートレイアウトなのですが、これも何故か結果シートブックに入力されません。
スペースや全角、半角違い、REF表示になった関数計算式などのチェックも全てしたのですが・・・
後はどんな原因が考えられますでしょうか・・・?

     |[D]|[E]   |[F]    |[G]|[H]|[I]|[J]|[K]|[L]|[M]|[N]|[O]    |[P] |[Q]               |[R] |[S]|[T]|[U]|[V]|[W]|[X]|[Y]|[Z]|[AA]|[AB]|[AC]|[AD]|[AE]|[AF]|[AG]    
 [3] |No.|レベル|品番   |   |   |   |   |   |   |   |   |       |版数|品名              |                               数量                          |区分|ユニット
 [4] |   |      |       |   |   |   |   |   |   |   |   |       |    |                  |       クッキー     |    Bクッキー      |    |        
 [5] |   |      |       |   |   |   |   |   |   |   |   |       |    |                  |  プレーン  |  チョコ   |プレーン|   チョコ    |    |        
 [6] |   |      |       |   |   |   |   |   |   |   |   |       |    |                  | 5枚  | 10枚 | 5枚 | 10枚 |5枚|10枚|5枚 | 5枚| 5枚| 5枚|    |        
 [7] |   |      |       |   |   |   |   |   |   |   |   |       |    |                  |袋 |箱 |袋 |箱 |袋 |箱 |袋 |箱 |袋 |箱  |袋  |袋  |袋  |袋  |    |        
 [8] |   |      |       |   |   |   |   |   |   |   |   |       |    |                  |    |   |   |   |   |   |   |   |   |    |    |    |    |    |    |        
 [9] |   |      |      0|  1|  2|  3|  4|  5|  6|  7|  8|       |    |                  |    |   |   |   |   |   |   |   |   |    |    |    |    |    |    |        
 [10]|   |      |       |   |   |   |   |   |   |   |   |       |    |                  |    |   |   |   |   |   |   |   |   |    |    |    |    |    |    |        
 [11]|   |     0|A021701|   |   |   |   |   |   |   |   |A021701|  00|ABCDSERGH     |   1|   |   |   |   |   |   |   |   |    |    |    |    |    |  20|梱包    
 [12]|   |     0|A021702|   |   |   |   |   |   |   |   |A021702|  00|ASFREGTRYJU    |    |  1|   |   |   |   |   |   |   |    |    |    |    |    |  20|梱包    
 [13]|   |     0|A021711|   |   |   |   |   |   |   |   |A021711|  00|Jvserfrehytr      |    |   |  1|   |   |   |   |   |   |    |    |    |    |    |  20|梱包    
 [14]|   |     0|A021712|   |   |   |   |   |   |   |   |A021712|  00|SFREYGTJUKI<      |    |   |   |  1|   |   |   |   |   |    |    |    |    |    |  20|梱包    
(Lila) 2015/09/28(月) 09:37

>また、もう1つのキーである品番、同じように見えているのでしょうが、本当に同じですか?
> あるセルと別のセルが同値かどうか、その検証は、シートのどこかに
> =結果シートのセル=データシートのセル
> と入れて True が表示されれば同値、False が表示されれば 異なる値。
> このように簡単に検証できますので、確認願います。

上記のレイアウト「せんべい」「もち」の方のテストデータシートの方でとりあえずの検証をしてみたのですが、TRUEが表示されました。
(Lila) 2015/09/28(月) 09:44


 とりあえず、提示の最初のほうのデータシートを作成して実行しましたが、こちらでは結果シート以下の通り取り込みが終わっています。
 (結果シートには、H列以降も項目がありますが、以下のコピペは せんべい と もち の部分のみ)

     |[A]       |[B] |[C] |[D]     |[E]|[F]     |[G] 
 [1] |          |    |    |        |   |せんべい|もち
 [2] |品番      |品目|品名|英語品名|   |        |    
 [3] |          |    |    |        |   |        |    
 [4] |          |    |    |        |   |        |    
 [5] |hoge      |a   |a   |a       |a  |a       |a   
 [6] |hogehoge  |a   |a   |a       |a  |a       |a   
 [7] |A002345   |a   |a   |a       |a  |a       |a   
 [8] |V024852   |a   |a   |a       |a  |a       |a   
 [9] |BFD1548   |a   |a   |a       |a  |a       |a   
 [10]|ABC123    |a   |a   |a       |a  |a       |a   
 [11]|ABC234    |a   |a   |a       |a  |a       |a   
 [12]|ABC345    |a   |a   |a       |a  |a       |a   
 [13]|Z001      |a   |a   |a       |a  |a       |a   
 [14]|Z002      |a   |a   |a       |a  |a       |a   
 [15]|Z003      |a   |a   |a       |a  |a       |a   
 [16]|M009993   |a   |a   |a       |a  |       1|    
 [17]|M011095   |a   |a   |a       |a  |        |   1
 [18]|M513069   |a   |a   |a       |a  |       1|    
 [19]|D3M-01K1-3|a   |a   |a       |a  |       1|    
 [20]|M513073   |a   |a   |a       |a  |        |   1
 [21]|M602699   |a   |a   |a       |a  |        |   2
 [22]|M513074   |a   |a   |a       |a  |       3|    
 [23]|M513075   |a   |a   |a       |a  |        |   5

 もちろん、結果シートには、A16〜A23の品番は、あらかじめ記載、F1:G4の項目群もあらかじめ記載した上で実行していますが。

 不思議ですねぇ。

 これから2番目の例も準備して検証を続けますが。

(β) 2015/09/28(月) 12:58


 もしかして・・・・

 提示のコードは、データシートの 項目群+【品番】で、結果シートの 項目群+【品番】をマッチングしています。
 もし、結果シートには、あらかじめ品番は記載されておらず、データシートから持ってきて追加という要件なら
 マッチしません。

 もし、品番は「追加」といことなら、そのようにコードも変更できますが、そうすると、一度結果シートを作成した。
 でも、データシートの数値が間違っていたので直して再取り込みしたという場合も、元の間違って取り込まれた
 品番行が残り、結果シート上には、その品番行が複数できてしまいます。

 もちろん、結果シートに同じ品番があればその場所を置換、なければ行追加を行うということはできますが・・・。

(β) 2015/09/28(月) 13:09


記述がされないだけで、最後まで動いてはいるようで、「処理が終了しました」というPOPは出るのですが・・・
βさんに頂いた以下のtest1の方で、実行しています。

>もちろん、結果シートには、A16〜A23の品番は、あらかじめ記載、F1:G4の項目群もあらかじめ記載した上で実行していますが。
私も、そこはあらかじめ記入し、実行しています。
ただ、私の方ではF列に追加した訳ではなかったので、そのせいでしょうか?
正規新規追加方法でもう一度試してみます!

Sub 使用数更新1()

    Dim sel As Variant
    Dim f As Variant
    Dim wb As Workbook
    Application.ScreenUpdating = False
    sel = Application.GetOpenFilename("ExcelBook,*.xlsx", Title:="対象ファイルを選んでください", MultiSelect:=True)
    If Not IsArray(sel) Then Exit Sub   'キャンセルボタン
    For Each f In sel
        Set wb = Workbooks.Open(f)
        データ取り込み wb.Sheets("Sheet1")    '★シート名変更
        wb.Close False
    Next
    Application.ScreenUpdating = True
    MsgBox "処理が終了しました"

 End Sub
Sub データ取り込み(shF As Worksheet)
 '=============================
    Dim comRow As Long
    Dim catRow As Long
    Dim comCol As Long
    Dim catCol As Long
 '=============================
    Dim f As Range
    Dim ok As Boolean
    Dim tmp As Long
    Dim r1 As Range
    Dim r2 As Range
    Dim r3 As Range
    Dim ck1 As Range
    Dim ck2 As Range
    Dim shT As Worksheet
    Dim mxCol As Long
    Dim mxRow As Long
    Dim nCols As Long
    Dim nRows As Long
    Dim vntF As Variant
    Dim vntT As Variant
    Dim k1 As String
    Dim k2 As String
    Dim k3 As String
    Dim k4 As String
    Dim dicX As Object
    Dim dicY As Object
    Dim dicH As Object
    Dim x As Long
    Dim y As Long
    Dim c As Range
    Dim r As Range
    Dim n As Range
    Dim k As Variant
    Dim com As Variant
    'データシート処理
    '=================================='データシートレイアウト規定 開始
    '品番列
    Set f = shF.Cells.Find(What:="品番", LookAt:=xlWhole, SearchOrder:=xlByRows)
    If Not f Is Nothing Then
        comCol = f.Column
        tmp = f.Row
        '数量(項目)列
        Set f = shF.Cells.Find(What:="数量", LookAt:=xlWhole, SearchOrder:=xlByRows)
        If Not f Is Nothing Then
            If f.Row = tmp Then
                catCol = f.Column
                catRow = f.Row + 1
                ok = True
            End If
        End If
    End If
    If Not ok Then
        MsgBox shF.Parent.Name & " のシートに、品番もしくは数量がないか、または同じ行ではないので処理をスキップします"
        Exit Sub
    End If
    mxRow = shF.Cells(Rows.Count, comCol).End(xlUp).Row                     'データシートの品番列最終行番号
    '品番開始行
    comRow = shF.Cells(mxRow, comCol).End(xlUp).Row
    '=================================='データシートレイアウト規定 終了
    nRows = mxRow - comRow + 1                                              'データシートの品番数
    mxCol = shF.Cells(catRow, Columns.Count).End(xlToLeft).Column           'データシートの項目のデータ最終列を求める
    mxCol = mxCol + shF.Cells(catRow, mxCol).MergeArea.Columns.Count - 1    'そのセルの結合セルの列数を加味して、表の最終列を求める
    nCols = mxCol - Columns(catCol).Column + 1                              '表の列数

    nRows = mxRow - comRow + 1                                              'データシートの品番数
    Set r1 = shF.Cells(comRow, comCol).Resize(nRows)                        '品番領域
    Set r2 = shF.Cells(catRow, catCol).Resize(4, nCols)                     '項目領域
    Set r3 = shF.Cells(comRow, catCol).Resize(nRows, nCols)                 'データ領域
    On Error Resume Next
    Set ck1 = Union(r1, r2, r3).SpecialCells(xlCellTypeFormulas, xlErrors)  '数式によるエラー値
    Set ck2 = Union(r1, r2, r3).SpecialCells(xlCellTypeConstants, xlErrors) '定数によるエラー値
    On Error GoTo 0
    If Not ck1 Is Nothing Or Not ck1 Is Nothing Then
        MsgBox "対象領域にエラー値がありますので " & shF.Parent.Name & " はブックは処理できません"
        Exit Sub
    End If
    Set dicX = CreateObject("Scripting.Dictionary")                  'データシート列タイトル辞書
    Set dicY = CreateObject("Scripting.Dictionary")                  'データシート品番辞書
    vntF = r3.Value                    'データシートのデータ領域を配列に取り込む
    For Each c In r2.Rows(1).Cells                    '項目領域の先頭行のセルを1つずつ取り出す
        If nonStrike(c) Then            '4階層すべてに取り消し線なければ採用
            k1 = c.MergeArea(1).Value                                   '先頭行キー
            k2 = c.Offset(1).MergeArea(1).Value            '2行目キー
            k3 = c.Offset(2).MergeArea(1).Value            '3行目キー
            k4 = c.Offset(3).Value                         '4行目キー
            x = x + 1
            dicX(k1 & vbTab & k2 & vbTab & k3 & vbTab & k4) = x         '列タイトルを見出しに配列内列番号を登録
        End If
    Next
    For Each c In r1                    '品番の取り出し
        y = y + 1
        dicY(c.Value) = y                                           '品番を見出しに配列内行番号を登録
    Next
    '結果シート処理
    Set shT = ThisWorkbook.Sheets("Sheet1")                     '★シート名変更
    Set dicH = CreateObject("Scripting.Dictionary")                 '結果シート列タイトル辞書
    mxCol = shT.Cells(4, Columns.Count).End(xlToLeft).Column        '結果シートの1行目のデータ最終列を求める
    mxCol = mxCol + shT.Cells(4, mxCol).MergeArea.Columns.Count - 1 'そのセルの結合セルの列数を加味して、表の最終列を求める
    mxRow = shT.Range("A" & Rows.Count).End(xlUp).Row               '結果シートの品番最終行
    nRows = mxRow - 4                                               '結果シートの品番数
    k1 = ""
    k2 = ""
    k3 = ""
    k4 = ""
    For Each c In shT.Range("F1").Resize(, nCols)           '1行目のセルを1つずつ取り出す
        k1 = c.MergeArea(1).Value                                   '先頭行キー
        k2 = c.Offset(1).MergeArea(1).Value            '2行目キー
        k3 = c.Offset(2).MergeArea(1).Value            '3行目キー
        k4 = c.Offset(3).Value                         '4行目キー
        dicH(c.Column) = k1 & vbTab & k2 & vbTab & k3 & vbTab & k4  '列番号を見出しに、その列タイトルを辞書登録
    Next
    vntT = shT.Range("F5").Resize(nRows, nCols).Value             '結果シートのデータ領域を配列に格納
    y = 0
    For Each r In shT.Range("A5").Resize(nRows)                    'データシートの品番取り出し
        y = y + 1
        x = 0
        com = r(1).Value                        '品番
        If dicY.exists(com) Then                                    '品番がデータシートにあれば
            For Each c In Range("F5").Offset(y - 1).Resize(, nCols)
                x = x + 1
                If dicX.exists(dicH(c.Column)) Then                     '項目キーがデータシートにあれば
                    vntT(y, x) = vntF(dicY(com), dicX(dicH(c.Column)))  '上書き
                End If
            Next
        End If
    Next
    '更新済み配列からセルに一括転記
    shT.Range("F5").Resize(UBound(vntT, 1), UBound(vntT, 2)).Value = vntT
 End Sub
 Private Function nonStrike(c As Range) As Boolean
    If c.MergeArea(1).Font.Strikethrough = False Then
        If c.Offset(1).MergeArea(1).Font.Strikethrough = False Then
            If c.Offset(2).MergeArea(1).Font.Strikethrough = False Then
                If c.Offset(3).Font.Strikethrough = False Then nonStrike = True
            End If
        End If
    End If
 End Function

(Lila) 2015/09/28(月) 13:12


>提示のコードは、データシートの 項目群+【品番】で、結果シートの 項目群+【品番】をマッチングしています。
> もし、結果シートには、あらかじめ品番は記載されておらず、データシートから持ってきて追加という要件なら
> マッチしません。

結果シートの品番等は、以前の通り、データシート擁するブックとはまた別の品番専用のブックからマクロで引っ張ってきているので、今回のテストケースも同様に、結果シートの方には先に「品番+項目」は記載してある状態で行っています。
(Lila) 2015/09/28(月) 13:15


>>もちろん、結果シートには、A16〜A23の品番は、あらかじめ記載、F1:G4の項目群もあらかじめ記載した上で実行していますが。
>私も、そこはあらかじめ記入し、実行しています。
>ただ、私の方ではF列に追加した訳ではなかったので、そのせいでしょうか?
>正規新規追加方法でもう一度試してみます!
こちら、F列から「せんべい」「もち」項目を追加してもう一度実行してみましたが、変わらず「a」のままで変化はありませんでした・・・。
(Lila) 2015/09/28(月) 13:20

 追加項目は F列からという縛りはありません。
 真ん中でもいいですし、一番後ろでも構いません。

 不思議ですねぇ。

 念のため、↑でアップされたそちらのコードを、こちらのコードをつき合わせてみます。
 (同じはずですけどね)

(β) 2015/09/28(月) 13:23


> 追加項目は F列からという縛りはありません。
> 真ん中でもいいですし、一番後ろでも構いません。
なるほど・・・とすると何が原因なのか謎ですね・・・

>念のため、↑でアップされたそちらのコードを、こちらのコードをつき合わせてみます。
> (同じはずですけどね)
はい、お手数ですがお願いします><
恐らく同じはず・・・ですが・・・

念のため、マクロ記述箇所の確認をさせてください。
開発タブ>Visual Basic>挿入>標準モジュール(現れた「Option Explicit」の下に書いていく)
で合っていますよね・・・?
(Lila) 2015/09/28(月) 13:28


 マクロの記載場所は、それでOKです。

 アップされたそちらのコードそのまま実行(シート名は結果シート、データシートともに そちらのコードに合わせ、Sheet1 にして実行)

 結果は、(β) 2015/09/28(月) 12:58 でアップしたものと全く同じく正常なものでした。

 う〜ん・・・コードが同じ、データシートも同じ(はず)、見えていないのは、そちらの結果シートが
 実際にはどうなっているかということですけど、ここに間違いはないですよねぇ・・・?

(β) 2015/09/28(月) 13:31


     |[A]       |[B] |[C] |[D]     |[E]|[F]     |[G] |[H]      |[I]   |[J] |[K] |[L]     |[M]|[N] |[O]|[P]   |[Q]|[R] |[S]| 
 [1] |品番      |品目|品名|英語品名|   |せんべい|もち|      Cクッキー           |                 クッキー                |
 [2] |          |    |    |        |   |        |    |      加糖      |  無糖   |        プレーン     |     チョコ        |
 [3] |          |    |    |        |   |        |    |5枚      |10枚  |5枚 |10枚|5枚     |   |10枚|   |5枚   |   |10枚|   |
 [4] |          |    |    |        |   |        |    |ケース   |ふくろ|小箱|束  |箱      |袋 |箱  |袋 |箱    |袋 |箱  |袋 |
 [5] |A021701   |a   |a   |a       |a  |a       |a   |a        |a     |a   |a   |a       |a  |a   |a  |      |  1|    |   |
 [6] |A021702   |a   |a   |a       |a  |a       |a   |a        |a     |a   |a   |a       |a  |a   |a  |     1|   |    |   |
 [7] |A021711   |a   |a   |a       |a  |a       |a   |a        |a     |a   |a   |a       |a  |a   |a  |      |   |   1|  1| 
 [8] |A021712   |a   |a   |a       |a  |a       |a   |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |
 [9] |A021751   |a   |a   |a       |a  |a       |a   |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |
 [10]|A021752   |a   |a   |a       |a  |a       |a   |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |
 [11]|A021761   |a   |a   |a       |a  |a       |a   |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |
 [12]|A021762   |a   |a   |a       |a  |a       |a   |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |
 [13]|M009993   |a   |a   |a       |a  |a       |a   |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |
 [14]|M011095   |a   |a   |a       |a  |a       |a   |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |
 [15]|M513069   |a   |a   |a       |a  |a       |a   |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |
 [16]|D3M-01K1-3|a   |a   |a       |a  |a       |a   |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |
 [17]|M513073   |a   |a   |a       |a  |a       |a   |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |
 [18]|M602669   |a   |a   |a       |a  |a       |a   |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |
 [19]|M513074   |a   |a   |a       |a  |a       |a   |a        |a     |a   |a   |a       |a  |a   |a  |a     |a  |a   |a  |

結果シートも恐らく同じはず・・・です・・・。
(Lila) 2015/09/28(月) 13:46


 念のため、結果シートを↑と全く同じイメージでつくり直して実行しましたが、やはり、こちらでは正しい結果です。

 あえていえば(処理には関係しませんが)A1からD1、こちらのテストでは、A2からD2 にしていました。
 (今回は、もちろん、A1からD1にしています)
 また、M3からS3までの小項目の部分、結合がはずれて、一方が空白値ですけど、今回の処理には関係のないところですし
 念のため、こちらでも結合をはずしてテスト。

 う〜ん・・・・これ以上は・・・・悩みます。

(β) 2015/09/28(月) 14:13


>M3からS3までの小項目の部分
ここは、ただ単にレイアウトの結合させ忘れです;
実際には、結合セルになっています。
すみません;

実行は、上部にある右向き△で行っていますが、これで間違いないですよね?

実際のデータの方でも、テストレイアウトと同じになるように、今回の処理に関係ない部分を削除してみたり、品番が同値か確かめてみたりを数箇所行ってみましたが、やはり、動いてはいる(処理完了POP出現有無で判断)けれど、値の書き出しが何故か出来ていない(「大項目〜形状」までの項目全てが入っているものはテストの状態では値入力が出来ている)状態です・・・。

(Lila) 2015/09/28(月) 14:26


 大項目から形状まですべて値のあるものは、そちらでもマッチして転記されるということですね。
 こちらでは、空白でもマッチしますが、わらをもすがる という感じで、この点、ちょっと調査してみます。

 >>上部にある右向き△で行っていますが、これで間違いないですよね? 

 上部にある右向き△とは何ですか?

(β) 2015/09/28(月) 14:30


> 大項目から形状まですべて値のあるものは、そちらでもマッチして転記されるということですね。
テスト段階では転記されました。
中項目に取り消し線のある場合、そこは転記しない、というのもちゃんと反映されていました。
ですが、実データでやってみると転記されず・・・(テストと同じレイアウトにしているのに駄目)なので、何が違うのかさっぱりなので、もしかしたら、見えない部分で何かマクロを邪魔しているものがあるかもしれないので、値のみコピーしてみてデータシートの別シートを作成して実行してみようと思います。

>上部にある右向き△とは何ですか?
Sub/ユーザー フォームの実行 というボタンです。
その隣に中断、リセットのボタンがあります。
(Lila) 2015/09/28(月) 14:36


 >>中項目に取り消し線のある場合、そこは転記しない、というのもちゃんと反映されていました。 

 えっ? 反映されるというのは転記されるということですか? であればバグですけど?
 ちゃんと転記しないロジックになっていたという意味ならいいのですが?

 >>テスト段階では・・・

 テスト段階では、大項目のみのデータも転記されたということですか?
 もし、そうなら、本番シートのセルの値が、どこかしら、違うんでしょうね。

 >>Sub/ユーザー フォームの実行 というボタンです。 

 あぁ、VBE画面の、実行メニューの中のことですね。了解。
 ちなみに、マクロの実行は、いろんな方法があります。
 VBE画面じゃなくても通常のシート画面で開発タブ->マクロ->使用数更新1 を選んで実行 でもいいですし
 シートにボタンを配置して、それに 使用数更新1 をマクロ登録しておいてもいいですね。

(β) 2015/09/28(月) 14:52


> >>中項目に取り消し線のある場合、そこは転記しない、というのもちゃんと反映されていました。
> えっ? 反映されるというのは転記されるということですか? であればバグですけど?
> ちゃんと転記しないロジックになっていたという意味ならいいのですが?
ちゃんと転記しないロジックになっていた、という意味です。

>テスト段階では、大項目のみのデータも転記されたということですか?
> もし、そうなら、本番シートのセルの値が、どこかしら、違うんでしょうね。
大項目のみはテスト段階から転記されません。
なので、恐らく同じレイアウトで試していただいているβさんの方は反映されていて、こちらではしていないので、謎になっている部分です。

データシートを別のブックで値のみ貼り付けし、項目は自分で打ったものを作成して実行してみたのですが、最後まで実行され(処理終了のPOP確認)ましたが、やはり反映はされておらず・・・。
実データで一番最初に同値が確認できるのが、(結果シートの「F4646」= データシートの「O226」)が最初なので、そこに「a」を入力して見ています。
(Lila) 2015/09/28(月) 15:11


数値の値の事で一点言い忘れていたのですが、基本的には「1」や「2」などの数値ですが、まれに「26m」「28.9m」「(1)」などの文字の場合もあるのですが、それも転記するのに問題はありませんか?
(Lila) 2015/09/28(月) 15:35

ブレークポイントを置いて「k1」に入っている値を見てみましたが、ちゃんと「せんべい」で入っているようです。
(確認箇所はコード最後の方の”dicH(c.Column) = k1 & vbTab & k2 & vbTab & k3 & vbTab & k4 '列番号を見出しに、その列タイトルを辞書登録”の「k1」です)
(Lila) 2015/09/28(月) 16:56

 計算はしておらず、単に転記しているだけですから 26m でも問題ないですし abc でも OK です。

 ところで、値がある部分を セル比較していただき、同値であることを確認してもらったのですが
 空白(と思われる)ところもチェックいただきましたか?

 結果シートのほうは、空白なら空白でつくられているのでしょうが、データシート側が、どんなふうに作られているのか
 不明なので。

 1.データシート側で、マッチするはずなのにマッチしないその項目の中の空白セルに対して
  セル比較するとどうなりますか?
 2.そのデータシートの空白セルに対して =LEN(そのセル) とすると、0 となりますか?
 3.データシートの実物で、とりあえず、マッチしない項目1つだけを残して、残りは列削除して実行してください。
  当然反映しませんよね。次に、そのデータシートの4項目を打ち直し(空白セルはDeleteキーでクリア)実行してみてください。
  これで、もし反映すれば、やはり項目の値(特に空白セル)が犯人だということになります。

(β) 2015/09/28(月) 17:13


テストで作成したものは、データシートの空白部はもちろん空白です。(新規ブックに手打ちで打ち込んだ為)
同じく、手打ちで作成した結果シート(実働用)も空白部は空白です。

運用テスト用データシートの空白は、1シートでも大量なので、確認の時間をください。
また明日にでも結果を書き込ませていただきます。
(Lila) 2015/09/28(月) 17:19


βさん、おはようございます。
データシートの方、空白部調べてみましたが、今のところ何か関数が入力されている気配はありません。
ただ、所々のセルにエラーというか、書式エラー(内容→「このセルにある数値が、テキスト形式か、またはアポストロフィで始まっています」)のようなものが出ている箇所がいくつかあります。
これは関係ありますでしょうか?

>1.データシート側で、マッチするはずなのにマッチしないその項目の中の空白セルに対して
  セル比較するとどうなりますか?

これはどういう意味でしょうか?

>2.そのデータシートの空白セルに対して =LEN(そのセル) とすると、0 となりますか?

「0」となった事を確認しました。

> 3.データシートの実物で、とりあえず、マッチしない項目1つだけを残して、残りは列削除して実行してください。
>  当然反映しませんよね。次に、そのデータシートの4項目を打ち直し(空白セルはDeleteキーでクリア)実行してみてください。
>  これで、もし反映すれば、やはり項目の値(特に空白セル)が犯人だということになります。

これは、一度、「クッキー>プレーン>5枚>袋」だけにして実行してみるという認識で合っていますか?

(Lila) 2015/09/29(火) 08:42


 1.のセル比較ですが、=結果シートのセル=現物のデータシートのセル として検証いただいているかと思いますけど
  もし、値があるセルだけを検証してもらっていたとすれば、空白のセル同士も、比較してみてくださいという意味でした。
  でも、データシートの空白セル(テストで作ったシートではなく本物のシート)の空白セルの桁数が =LEN(空白セル) で 0 になっているとすれば、
  この比較でも True になりそうですが。

 実物のデータシートで列削除を、お願いしたのは、できるだけ小さなデータで検証したかったことと
 (もくろみとしては、小さくしてもマッチしないものはマッチしない)
 マッチしないことを確認した後、その小さくしたデータシートの大項目〜形状と品番を入力しなおして(空白セルはDeleteキー)再試行してもらう(もくろみとしてはマッチする)
  際のそちらの手間を最小限にしたかったからです。

 また、この確認には クッキー、プレーン、5枚、袋 は適していません。
 大項目のみではマッチしないという現象を解決するための方策ですから、現物のデータシートで、そういったものがあるデータを選んでください。
 とにかく、現物ではマッチしないけど、テストデータとして同じようなものを作成するとマッチするということの
 原因究明をしたいわけです。

 よろしく。

 ★この検証は、現物であっても、大項目〜形状 まで値があるものはマッチする、大項目のみのものはマッチしないと
  そう、報告をいただいていることを根拠にしています。
  もし、そうではなく、項目に値があろうが、空白であろうが、現物データは、どれもマッチしないということなら、
  検証方法を考え直さなければいけませんが?

(β) 2015/09/29(火) 09:14


> ★この検証は、現物であっても、大項目〜形状 まで値があるものはマッチする、大項目のみのものはマッチしないと
>  そう、報告をいただいていることを根拠にしています。
>  もし、そうではなく、項目に値があろうが、空白であろうが、現物データは、どれもマッチしないということなら、検証方法を考え直さなければいけませんが?

実データでは、どちらもマッチしていません。
マッチしたのは、テスト用に作成した「大項目〜形状」まで埋まったもののみで、そちらは取り消し線のあるものも、ちゃんと想定通りの動き(取り消し線項目は記載しない)をしていました。

(Lila) 2015/09/29(火) 09:22


大項目〜形状まであるレイアウトの実データの値のみコピーして、新規ブックに項目を打ち直し、空白を全てDeleteしたもので変数に値を入れる箇所でおかしな数値がないか見ていました。
少し「ん?」と思った所があったので、聞かせてください。

データ取り込みの上部の方で、品番、項目、データのそれぞれの領域を指定している以下の箇所で

> Set r1 = shF.Cells(comRow, comCol).Resize(nRows) '品番領域
> Set r2 = shF.Cells(catRow, catCol).Resize(4, nCols) '項目領域
> Set r3 = shF.Cells(comRow, catCol).Resize(nRows, nCols) 'データ領域

「r1」に「25」
「r2」に「14」
の値が入っていました。
項目領域は14列なので問題なさそうかな?と思うのですが・・・
品番領域がおかしいような気がしています。
以下のレイアウトでの品番領域「25」というのは何処を指しているのでしょうか?
よろしくお願いします><

※レイアウトは((Lila) 2015/09/28(月) 09:37)のものと同じですが、念のため。

     |[D]|[E]   |[F]    |[G]|[H]|[I]|[J]|[K]|[L]|[M]|[N]|[O]    |[P] |[Q]               |[R] |[S]|[T]|[U]|[V]|[W]|[X]|[Y]|[Z]|[AA]|[AB]|[AC]|[AD]|[AE]|[AF]|[AG]    
 [3] |No.|レベル|                        品番                   |版数|品名              |                               数量                          |区分|ユニット
 [4] |   |      |                                               |    |                  |       クッキー     |    Bクッキー      |    |        
 [5] |   |      |                                               |    |                  |  プレーン  |  チョコ   |プレーン|   チョコ    |    |        
 [6] |   |      |                                               |    |                  | 5枚  | 10枚 | 5枚 | 10枚 |5枚|10枚|5枚 | 5枚| 5枚| 5枚|    |        
 [7] |   |      |                                               |    |                  |袋 |箱 |袋 |箱 |袋 |箱 |袋 |箱 |袋 |箱  |袋  |袋  |袋  |袋  |    |        
 [8] |   |      |                                               |    |                  |    |   |   |   |   |   |   |   |   |    |    |    |    |    |    |        
 [9] |   |      |      0|  1|  2|  3|  4|  5|  6|  7|  8|       |    |                  |    |   |   |   |   |   |   |   |   |    |    |    |    |    |    |        
 [10]|   |      |       |   |   |   |   |   |   |   |   |       |    |                  |    |   |   |   |   |   |   |   |   |    |    |    |    |    |    |        
 [11]|   |     0|A021701|   |   |   |   |   |   |   |   |A021701|  00|ABCDSERGH     |   1|   |   |   |   |   |   |   |   |    |    |    |    |    |  20|梱包    
 [12]|   |     0|A021702|   |   |   |   |   |   |   |   |A021702|  00|ASFREGTRYJU    |    |  1|   |   |   |   |   |   |   |    |    |    |    |    |  20|梱包    
 [13]|   |     0|A021711|   |   |   |   |   |   |   |   |A021711|  00|Jvserfrehytr      |    |   |  1|   |   |   |   |   |   |    |    |    |    |    |  20|梱包    
 [14]|   |     0|A021712|   |   |   |   |   |   |   |   |A021712|  00|SFREYGTJUKI<      |    |   |   |  1|   |   |   |   |   |    |    |    |    |    |  20|梱包    

(Lila) 2015/09/29(火) 15:45
文を少し修正しました。(Lila)16:58


 >>「r1」に「25」 
 >>「r2」に「14」 
 >>の値が入っていました。 

 まず、r1,r2 ともに【領域】ですのでRangeオブジェクトです。
 その「値」といわれるのは、具体的にどう確認されたのかはわかりませんが、たとえば領域の先頭のセルの値を
 確認すれば、r1 なら "A021701" ですし、r2 なら "クッキー"

 r1 や r2 の領域のアドレスのことを言われているなら r1 は F11:F● ですし、 r2 なら R4:AE7 ですね。
 で、この r1 が F25 となっていたのですか?

 もし、そうなっていれば絶対にマッチはしませんね。
 なぜ F25 になったのか??

 ここに原因があると思われます。

 ★25 というのが具体的にどこの変数にある、どの値でしょうか?
(β) 2015/09/29(火) 18:45

 現物のデータシートで、以下のいずれかなら、品番列や、それに伴う品番領域(これは項目に紐付くデータ領域にも影響しますが)
 が、予期しないものになります。(ないとは思いますが)

 1.アップされた例には記載がありませんが、1行目または2行目のどこかに "品番" というものが入ったセルが存在する。

 2.あるいは、アップされた例では F3 が、実は "品番" ではない。スペースと"品番"とか、"品番"とスペースとか。
   で、それとは別に、どこかに、"品番" と入ったセルがある。

(β) 2015/09/29(火) 19:17


 ↑ もし、2.であれば

 Set f = shF.Cells.Find(What:="品番", LookAt:=xlWhole, SearchOrder:=xlByRows)

 これを

 Set f = shF.Cells.Find(What:="品番", LookAt:=xlPart, SearchOrder:=xlByRows)

 として処理する手もありますが。

(β) 2015/09/30(水) 07:02


 "品番"という文字列がマッチしないケースをいろいろ考えているんですが、
 たとえば新規ブックで以下のコードを実行してみてください。

 A1 には "品番" と表示されますが、その桁数は 2 ではなく、 3 ですし、また "品番" かどうかのチェックでは
 False になります。

 また A1 を選択して、数式バーに 品番 と表示された、その数式バーの後ろのほうをクリックしても
 |マークは 番 の直後にきて、番 の後ろには何もないように表示されます。

 実物のデータシートの文字が、どのようにセットされているのかは、こちらではわかりませんが
 1つの例として。

 Sub test1()
    Range("A1").Value = "品" & vbTab & "番"
    MsgBox Len(Range("A1"))
    MsgBox Range("A1").Value = "品番"
 End Sub

 Sub test2()
    Range("A1").Value = "品番" & vbTab
    MsgBox Len(Range("A1"))
    MsgBox Range("A1").Value = "品番"
 End Sub

(β) 2015/09/30(水) 07:33


βさん、おはようございます。
いつもありがとうございます!

>★25 というのが具体的にどこの変数にある、どの値でしょうか?
これは、下記の

>> Set r1 = shF.Cells(comRow, comCol).Resize(nRows) '品番領域
>> Set r2 = shF.Cells(catRow, catCol).Resize(4, nCols) '項目領域
>> Set r3 = shF.Cells(comRow, catCol).Resize(nRows, nCols) 'データ領域

それぞれ、一番最後の()内です。
カーソルを合わせたら、「r○=○○」と表示されたので、そこで確認しました。
又、同じ箇所の確認で、今度はテストで成功した大項目〜形状まであるのレイアウト((β) 2015/09/24(木) 09:27)のもの)の方ですと
「r1 = 3」
「r2 = 14」
でした。

>1.アップされた例には記載がありませんが、1行目または2行目のどこかに "品番" というものが入ったセルが存在する。

アップしたレイアウトのAG列以降には色々項目はありましたが、現在検証中のレイアウトは、記載通り「D列〜AG列」までのものです。(項目だけ手打ちで、データ部分は値のみコピー、空白部は全てDelete済)
なので、「品番」セルは「F3〜O8」までの結合セルのみです。

> 2.あるいは、アップされた例では F3 が、実は "品番" ではない。スペースと"品番"とか、"品番"とスペースとか。
> で、それとは別に、どこかに、"品番" と入ったセルがある。

品番項目、セル結合を解いたり、結合したまま確認もしましたが、スペースは入っていないです。

コード実行してみました。
βさんの仰る通り、A1に「品番」と入力され、POPで「3」となり「False」が表示されました。

(Lila) 2015/09/30(水) 08:42


 ●まず

 最後の ( ) 内というと、

 Set r1 = shF.Cells(comRow, comCol).Resize(nRows) '品番領域]

 これは nRows つまり、品番の領域の行数(品番の数) です。 これが 3 ということは 3行ですので
 ((β) 2015/09/24(木) 09:27 のレイアウトなら正しいですね。

 ただ、(Lila) 2015/09/29(火) 15:45 のレイアウトでの確認で、これが 25 になったんですか?
 アップされた例では 11行目から14行目までの 4 になるはずなんですが?

 それと、 r2 のほうは、最後の ( ) 内は 4,nCols の 2つの値です。
 nCols にマウスを当てれば 項目の列数になります。
 (Lila) 2015/09/29(火) 15:45 のレイアウトでは、R列〜AE列までの 14 で、これは正解ですね。

 ●以下のパターンで、転記される、されない、あるいは される場合もあり、されない場合のある。
  この3つにわけて整理していただけませんか。

 1.大項目のみ、あとは空白の手入力によるテストデータ
 2.大項目のみ、あとは空白だけど、実物のデータ
 3.大項目〜形状まで、すべてある手入力によるテストデータ
 4.大項目〜形状まで、すべてあるけど、実物のデータ

 ●品番項目、セル結合を解いたり、結合したまま確認もしましたが、スペースは入っていないです。 

 スペースの有無は、数式バー等で目視できますよね。スペースではなく制御文字の場合は、目視ではわからないので
 その状態を作り出すコードをアップしましたが、データシートの"品番" と入ったセルに対して =LEN(そのセル) で、ちゃんと 2 がでるということですか?

 ★あと、このトピも、長くなって、スクロールも大変になってきました。
  このトピを
『他のブックからVBAでデータ抽出する方法』(Lila) 
  こんなように参照した形で No.2 トピを立ち上げてもらったほうがよさそうですね。

(β) 2015/09/30(水) 11:06


>ただ、(Lila) 2015/09/29(火) 15:45 のレイアウトでの確認で、これが 25 になったんですか?
> アップされた例では 11行目から14行目までの 4 になるはずなんですが?

アップしたのは4行までですが、実際のデータは1346行までありますので、やはり「25」はおかしいですね・・・

> ●以下のパターンで、転記される、されない、あるいは される場合もあり、されない場合のある。

  この3つにわけて整理していただけませんか。

【転記されない】
> 1.大項目のみ、あとは空白の手入力によるテストデータ
> 2.大項目のみ、あとは空白だけど、実物のデータ
> 4.大項目〜形状まで、すべてあるけど、実物のデータ

【転記される】
> 3.大項目〜形状まで、すべてある手入力によるテストデータ

【転記される場合もあり、されない場合もある】
今のところ再現なし

>スペースの有無は、数式バー等で目視できますよね。スペースではなく制御文字の場合は、目視ではわからないのでその状態を作り出すコードをアップしましたが、データシートの"品番" と入ったセルに対して =LEN(そのセル) で、ちゃんと 2 がでるということですか?

そうです。
ちゃんと2が出ました。

>★あと、このトピも、長くなって、スクロールも大変になってきました。

  このトピを
『他のブックからVBAでデータ抽出する方法』(Lila) 
  こんなように参照した形で No.2 トピを立ち上げてもらったほうがよさそうですね。

了解しました!
では、必要そうなレイアウトと今の所の情報を書き込んで、トピック立ち上げますね!
(Lila) 2015/09/30(水) 11:24


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.