Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6513 / 13646 ツリー ←次へ | 前へ→

【44766】判定表を作りたいです。 ヒロユキ 06/11/30(木) 21:38 質問[未読]
【44769】Re:判定表を作りたいです。 ichinose 06/11/30(木) 22:56 発言[未読]
【44773】Re:判定表を作りたいです。 ヒロユキ 06/11/30(木) 23:57 発言[未読]
【44777】Re:判定表を作りたいです。 ichinose 06/12/1(金) 7:29 発言[未読]
【44778】Re:判定表を作りたいです。 ヒロユキ 06/12/1(金) 8:31 お礼[未読]
【44789】Re:判定表を作りたいです。 ichinose 06/12/1(金) 13:03 発言[未読]
【44814】Re:判定表を作りたいです。 ヒロユキ 06/12/1(金) 21:04 お礼[未読]

【44766】判定表を作りたいです。
質問  ヒロユキ  - 06/11/30(木) 21:38 -

引用なし
パスワード
   はじめまして。初心者です。悩んでいます。

1〜18までのデータがありまして、番号がユニークにB11〜B28まで
入っています。この5位まで、すなわちB11〜B15のデータを、
参照表を使って判定表を作りたいのです。

  A    B   C
1 2or17  9or10 4or15
2 7or12  5or14 3or16
3 6or13  1or18 8or11

上記の表を参照して、
データ例(1)
  A B C
11   2
12   12
13   14
14   4
15   9
16



32 1. 5. 4.
33 2. 3.
34

データ例(2)
  A B C
11   11
12   5
13   8
14   18
15   7
16



32
33 5. 2.
34   4. ◎
データ例(2)では、11と8が重複するので「◎」としたいです。
それから、1.〜5.◎は凡例をセルのA51〜A56などに作っておいて、
コピー&ペーストすれば良いのかなと思っています。

マクロでうまくいくでしょうか。
良い方法がありましたら、教えてください。
よろしくお願いします。

【44769】Re:判定表を作りたいです。
発言  ichinose  - 06/11/30(木) 22:56 -

引用なし
パスワード
   ▼ヒロユキ さん:
こんばんは。


>1〜18までのデータがありまして、番号がユニークにB11〜B28まで
>入っています。この5位まで、すなわちB11〜B15のデータを、
>参照表を使って判定表を作りたいのです。
>
>  A    B   C
>1 2or17  9or10 4or15
>2 7or12  5or14 3or16
>3 6or13  1or18 8or11

↑この参照表が評価するのが難しいデータですが、
このままでいきましょう。
(A1〜C3が参照表だとします)
>
>上記の表を参照して、
>データ例(1)
>  A B C
>11   2
>12   12
>13   14
>14   4
>15   9
>16
>・
>・
>・
上記のようにB11〜B15にある場合、


>32 1. 5. 4.
>33 2. 3.
>34

↑この結果をセルA32〜C34に表示するには、


標準モジュールに

'==========================================================
Sub main()
  Dim rng As Range
  For Each rng In Range("a32:c34")
    With rng
     .Formula = "=CHOOSE(SUMPRODUCT(ISERROR(MATCH({" & _
        Replace(.Offset(-31, 0).Value, "or", ",") & _
        "},B11:B15,0))*1)+1,""◎""" & _
        ",SUMPRODUCT(IF(ISERROR(MATCH({" & _
        Replace(.Offset(-31, 0).Value, "or", ",") & _
        "},B11:B15,0)),0,MATCH({" & _
        Replace(.Offset(-31, 0).Value, "or", ",") & _
        "},B11:B15,0))),"""")"
     .Value = .Value
     End With
    Next
End Sub

mainを実行してみてください。

データ例(2)の場合も確認してみて下さい。

【44773】Re:判定表を作りたいです。
発言  ヒロユキ  - 06/11/30(木) 23:57 -

引用なし
パスワード
   ▼ichinose さん、ありがとうございます。

>>1〜18までのデータがありまして、番号がユニークにB11〜B28まで
>>入っています。この5位まで、すなわちB11〜B15のデータを、
>>参照表を使って判定表を作りたいのです。
>>
>>  A    B   C
>>1 2or17  9or10 4or15
>>2 7or12  5or14 3or16
>>3 6or13  1or18 8or11
>
>↑この参照表が評価するのが難しいデータですが、
>このままでいきましょう。
>(A1〜C3が参照表だとします)
>>
>>上記の表を参照して、
>>データ例(1)
>>  A B C
>>11   2
>>12   12
>>13   14
>>14   4
>>15   9
>>16
>>・
>>・
>>・
>上記のようにB11〜B15にある場合、
>
>
>>32 1. 5. 4.
>>33 2. 3.
>>34
>
>↑この結果をセルA32〜C34に表示するには、
>
>
>標準モジュールに
>
>'==========================================================
>Sub main()
>  Dim rng As Range
>  For Each rng In Range("a32:c34")
>    With rng
>     .Formula = "=CHOOSE(SUMPRODUCT(ISERROR(MATCH({" & _
>        Replace(.Offset(-31, 0).Value, "or", ",") & _
>        "},B11:B15,0))*1)+1,""◎""" & _
>        ",SUMPRODUCT(IF(ISERROR(MATCH({" & _
>        Replace(.Offset(-31, 0).Value, "or", ",") & _
>        "},B11:B15,0)),0,MATCH({" & _
>        Replace(.Offset(-31, 0).Value, "or", ",") & _
>        "},B11:B15,0))),"""")"
>     .Value = .Value
>     End With
>    Next
>End Sub
>
>mainを実行してみてください。
>
>データ例(2)の場合も確認してみて下さい。


ありがとうございます。
こんなに、早く返信があるとは思いませんでした。
コードをだらだら書かなくてはいけないと思っていたのですが、
やはり、このケースはOffsetを使うのですね。自分はまだ理解に至っていませんが。

エラーがでました。'1004'のエラーで
データ例(1)はB32が「0」
データ例(2)はB32〜C34が「0」で中断しました。

また、他のデータでテストしてみましたら、
◎が3カ所と「0」が入力された表になってしまいました。

エクセルは2000です。
当方は、まだスキルがないのでどこがいけないか、理解できていません。
ちなみに、エラーの範囲は、
>.Formula = "=CHOOSE(SUMPRODUCT(ISERROR(MATCH({" & _
>        Replace(.Offset(-31, 0).Value, "or", ",") & _
>        "},B11:B15,0))*1)+1,""◎""" & _
>        ",SUMPRODUCT(IF(ISERROR(MATCH({" & _
>        Replace(.Offset(-31, 0).Value, "or", ",") & _
>        "},B11:B15,0)),0,MATCH({" & _
>        Replace(.Offset(-31, 0).Value, "or", ",") & _
>        "},B11:B15,0))),"""")"
>     .Value = .Value

でした。

すみません。よろしくお願いします。

【44777】Re:判定表を作りたいです。
発言  ichinose  - 06/12/1(金) 7:29 -

引用なし
パスワード
   ▼ヒロユキ さん:
おはようございます。


>
>エラーがでました。'1004'のエラーで
>データ例(1)はB32が「0」
>データ例(2)はB32〜C34が「0」で中断しました。
私が確認した限りでは両方とも正しい結果が表示されました。
こういう場合、私とヒロユキ さんが見ているシートが違う
ということが原因になっていると思います。

で、サンプルデータもマクロで作成します。

新規ブック(何も入力されていないブック)の標準モジュールに

'============================================================
Option Explicit
Sub サンプルデータも作成したmainのテスト()
  With Range("a1:c3")
    .FormulaArray = "={""2or17"",""9or10"",""4or15"";" & _
             """7or12"",""5or14"",""3or16"";" & _
             """6or13"",""1or18"",""8or11""}"
    .Value = .Value
    End With
  With Range("b11:b15")
    .Value = Application.Transpose(Array(2, 12, 14, 4, 9))
    Range("a32:c34").ClearContents
    MsgBox "ご覧のデータでmainを実行します"
    Call main
    MsgBox "例1 結果を確認してください"
    .Value = Application.Transpose(Array(11, 5, 8, 18, 7))
    Range("a32:c34").ClearContents
    MsgBox "ご覧のデータでmainを実行します"
    Call main
    MsgBox "例2 結果を確認してください"
    .Value = Application.Transpose(Array(17, 9, 3, 11, 16))
    Range("a32:c34").ClearContents
    MsgBox "ご覧のデータでmainを実行します"
    Call main
    MsgBox "例3 結果を確認してください"
    End With
End Sub
'=====================================================================
Sub main()
  Dim rng As Range
  For Each rng In Range("a32:c34")
    With rng
     .Formula = "=CHOOSE(SUMPRODUCT(ISERROR(MATCH({" & _
        Replace(.Offset(-31, 0).Value, "or", ",") & _
        "},B11:B15,0))*1)+1,""◎""" & _
        ",SUMPRODUCT(IF(ISERROR(MATCH({" & _
        Replace(.Offset(-31, 0).Value, "or", ",") & _
        "},B11:B15,0)),0,MATCH({" & _
        Replace(.Offset(-31, 0).Value, "or", ",") & _
        "},B11:B15,0))),"""")"
     .Value = .Value
     End With
    Next
End Sub

として、何も入力されていないシートに対して、
「サンプルデータも作成したmainのテスト」を実行してみてください

3つの例で試しています。

mainというプログラムは、アクティブシートの
セルA1〜C3、B11〜B15を参照して計算した結果を
セルA32〜C34に出力しています。

mainは前回のコードと何ら変わっていません。


上記のコードが正しく作動しましたら、

ヒロユキ さんが試したデータと上記のコードで作成したサンプルデータの

違いを調べてみてください。

違いが分かれば、原因追求の手がかりになります。

試してみてください。

【44778】Re:判定表を作りたいです。
お礼  ヒロユキ  - 06/12/1(金) 8:31 -

引用なし
パスワード
   ichinoseさん おはようございます。

私が、作成したい結果が得られました。
ありがとうございました。

原因としましては、「参照表は、順位がこのセルに入ります。」
という伝達のイメージでしか私にはなく、実際に参照表を使用して、
計算されているとは思いませんでした。

質問ですが、◎に対して半角の数字では淋しいので、
全角のマル1.からマル5.と表記すること可能でしょうか?

まずは、お礼まで。
お忙しいところ、私のような初心者に回答をいただきまして、
ありがとうございました。

【44789】Re:判定表を作りたいです。
発言  ichinose  - 06/12/1(金) 13:03 -

引用なし
パスワード
   ▼ヒロユキ さん:
こんにちは。

まず、
>質問ですが、◎に対して半角の数字では淋しいので、
>全角のマル1.からマル5.と表記すること可能でしょうか?
これ・・・。
前回投稿のコードを以下のように変更してください。

'=========================================================
Sub サンプルデータも作成したmainのテスト()
  With Range("a1:c3")
    .FormulaArray = "={""2or17"",""9or10"",""4or15"";" & _
             """7or12"",""5or14"",""3or16"";" & _
             """6or13"",""1or18"",""8or11""}"
    .Value = .Value
    End With
  With Range("b11:b15")
    .Value = Application.Transpose(Array(2, 12, 14, 4, 9))
    Range("a32:c34").ClearContents
    MsgBox "ご覧のデータでmainを実行します"
    Call main
    MsgBox "例1 結果を確認してください"
    .Value = Application.Transpose(Array(11, 5, 8, 18, 7))
    Range("a32:c34").ClearContents
    MsgBox "ご覧のデータでmainを実行します"
    Call main
    MsgBox "例2 結果を確認してください"
    .Value = Application.Transpose(Array(17, 9, 3, 11, 16))
    Range("a32:c34").ClearContents
    MsgBox "ご覧のデータでmainを実行します"
    Call main
    MsgBox "例3 結果を確認してください"
    End With
End Sub
'=====================================================================
Sub main()
  Dim rng As Range
  For Each rng In Range("a32:c34")
    With rng
     .Formula = "=CHOOSE(SUMPRODUCT(ISERROR(MATCH({" & _
        Replace(.Offset(-31, 0).Value, "or", ",") & _
        "},B11:B15,0))*1)+1,""◎""" & _
        ",char(SUMPRODUCT(IF(ISERROR(MATCH({" & _
        Replace(.Offset(-31, 0).Value, "or", ",") & _
        "},B11:B15,0)),0,MATCH({" & _
        Replace(.Offset(-31, 0).Value, "or", ",") & _
        "},B11:B15,0)))+11552),"""")"
'          ↑この数式をちょっと変更しています
     .Value = .Value
     End With
    Next
End Sub


これで試してみてください。


>原因としましては、「参照表は、順位がこのセルに入ります。」
>という伝達のイメージでしか私にはなく、実際に参照表を使用して、
>計算されているとは思いませんでした。

ということなら、最初に「この参照表の作り方をどうすればよいか?」という
ご質問をしてください。
その際には、このような処理を行うバックボーンからの説明が必要ですけどね!!

最初の投稿でも申しましたが、

>>  A    B   C
>>1 2or17  9or10 4or15
>>2 7or12  5or14 3or16
>>3 6or13  1or18 8or11

>↑この参照表が評価するのが難しいデータですが、
>このままでいきましょう。

これ「or」の代わりに「,」にしただけでもコード(数式の箇所)はもう少し
簡単になるんです(だって、Replaceが不要になるから)。

このデータのレイアウトを工夫すれば、
コードはもっと簡単になると思いますよ!!

【44814】Re:判定表を作りたいです。
お礼  ヒロユキ  - 06/12/1(金) 21:04 -

引用なし
パスワード
   ichinose さん
回答、ありがとうございます。

既存のコードの中で処理できるとは、VBAの奥深さに、
改めて感動しました。

>これ「or」の代わりに「,」にしただけでもコード(数式の箇所)はもう少し
>簡単になるんです(だって、Replaceが不要になるから)。
>
>このデータのレイアウトを工夫すれば、
>コードはもっと簡単になると思いますよ!!

レイアウトの工夫までは、考えがおよびませんが、
「,」に置換して、「Replaceが不要になる」をヒントに
丁寧に、不要コードをとって実行しましたところ、私にもできました。

初めて投稿させていただき、今回、色々と学べました。
本当に、ありがとうございました。

6513 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free