アプリ版:「スタンプのみでお礼する」機能のリリースについて

3つ以上の条件は配列を使いたいです。

Dim Hairetu_List(30) As Variant
Hairetu_Listは0~30まで文字列が入っている

以下のようにすると全ての行が引っ込んでしまいます。どうすればうまくいくでしょうか。

wb.Sheets(1).Range("A1:G1").AutoFilter '全体にフィルターをかける

wb.Sheets(1).Range("C1").AutoFilter Field:=3, _
Criteria1:=Hairetu_List, _
Operator:=xlFilterValues

質問者からの補足コメント

  • どう思う?

    もしやwb.Sheets(1).Range("C1").AutoFilterにHairetu_Listの値がなければまずかったりするのでしょうか。
    Hairetu_Listは余計な文字列がたくさん入っているので

      補足日時:2019/11/14 14:00
  • うーん・・・

    ちなみに非表示になるHairetu_Listは15,16,17の部分でした。
    18から30までは普通に表示されました。

    No.5の回答に寄せられた補足コメントです。 補足日時:2019/11/14 16:28

A 回答 (5件)

No4です



>その通りだと思います。
…というわけでもなさそうです。
No4に示したようなセル範囲の値をまとめて変数に代入する方法をとると二次元配列になりますが、ご提示のように、ループ内で各配列要素にひとづずつ代入してゆく方式なら、そのようなことはありません。
どうやら、よくわからない迷路に入ってしまったようです。(汗

>0~30まで1つずつ順に見てみましたが、ヒットした部分は行がでてきました。
う~~ん。配列になったら結果が変わるってことですよね?
配列のままでフィルターをかけることにして、0~30の要素数を順に変えて試してみると、どこからか全部非表示になり始めるところがあると思いますので、その近辺に何かあると想像できます。

現状の配列を作成した後で、
 ReDim Preserve Hairetu_List(n)
とすると、配列の要素数をnに減ずることができます。
(再定義の為には、配列を動的配列にしておく必要があります)

このnを1から順に増加してみて(n=1ならヒット行が表示されると予想します)、30までのどこかで非表示に変わると思いますので、そのあたりに何かありそうだということになります。
なお、必ずヒットするように、あらかじめ先頭には合致する値を入れておいた方が良いでしょう。
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます。今日はこれから出張なので明日もう1度考えてみます。

お礼日時:2019/11/14 16:27

No3です



ふと思いつきましたが、ひょっとするとHairetu_Listを定義するのに
 Hairetu_List = Range("Z1:Z10").Value
のように、シートからまとめて読み込むようなことをしていませんか?

この場合は、結果の配列が二次元配列になるので、うまくいかない可能性が出てきます。
インデックス(1)の配列が代用されるようですので、その中の値でヒットしない場合には、全ての行が非表示になる可能性があります。(残りの要素に関しては無視されるようです)
    • good
    • 0
この回答へのお礼

その通りだと思います。以下の場合どこを修正したらいいのでしょうか。

'一旦シート2のA列にすべて書き出したものを重複削除する
wb.Sheets(2).Range("$A$1:$A$600").RemoveDuplicates Columns:=1, _
Header:=xlNo

For i = 0 To 600

If wb.Sheets(2).Range("A" & i + 1).Value = "" Then
Exit For

End If

Hairetu_List(i) = wb.Sheets(2).Range("A" & i + 1).Value

Next i

お礼日時:2019/11/14 15:04

No2です



>余計な文字列がたくさん入っているので
簡単なデータ例で試してみましたが、余計な文字列があっても問題は無いようです。
該当するものだけきちんと残るようですね。

該当するものが全くなければ(当然ながら)、全部非表示になります。
ですので、一番怪しいのは(合致していると思っているけれど)実は、合致していないとか。
(異体文字とか。○と◯、〇など)

例えば、ループで、フィルタ解除後にNo1の様に配列要素ひとつだけでフィルタをかけ、Stopを入れておくと、一旦その状態が表示されますので、その要素にヒットする行があるか無いかがわかります。
F5キーで継続されて、次の配列要素にヒットするかが表示されますので、順に試してみることで、(本当に)全ての項目でヒットしていないのだということを確かめることもできるでしょう。
    • good
    • 0
この回答へのお礼

0~30まで1つずつ順に見てみましたが、ヒットした部分は行がでてきました。
しかし、以下のように戻すと2行目から300行がすべて非表示となり何の値もでてこないです。
wb.Sheets(1).Range("C1").AutoFilter Field:=3, _
Criteria1:=Hairetu_List, _
Operator:=xlFilterValues

お礼日時:2019/11/14 14:50

No1です



勘違いしていました。大変失礼しました。
No1は無視してください。

>以下のようにすると全ての行が引っ込んでしまいます。
問題は、「合致するものが一つも存在しない」ってことなのでしょうか?

合致するものを含む配列で試してみても、全部非表示になるということでしょうか?
合致する値のどれかをインデックスで抜き出して、指定しても全部非表示になりますか?
配列にはきちんと予定の内容がセットされていることが確認できていますか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。Hairetu_Listの8割ぐらいはC列に存在します!
そこはMsgBoxなどで配列を順に見て確認済みです。
また、Criteria1:=Hairetu_List(1)とするとうまく絞り込めます。

お礼日時:2019/11/14 14:12

こんにちは



うまくいかないことは説明されているけれど、何をしたいのかが書かれてないので、勝手に推測。

 Criteria1:=Hairetu_List, _
    ↓  ↓  ↓
 Criteria1:=Hairetu_List(1), _

とかでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。わかりにくくて申し訳ございません
C列をHairetu_List(0)~Hairetu_List(30)すべてで絞り込みたいです。

おそらく、wb.Sheets(1).Range("C1").AutoFilterの中に
Hairetu_List(0)~Hairetu_List(30)の文字列がない場合も結構あります。

お礼日時:2019/11/14 14:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!