プロが教える店舗&オフィスのセキュリティ対策術

Excel2003 vba
お世話になります。以下のようなコードを書いているのですが、意図しない動きをしているのでご教授願いたいです。

No|名前 |食べられる
1 |リンゴ|○
2 |テレビ|
3 |電話 |
4 |バナナ|○
5 |ミカン|○

上のようなデータにオートフィルタをかけて、○がついているデータだけを配列に取り込もうとしています。

Dim Buff As Variant
Cells(1, 1).AutoFilter field:=3, Criteria1:="○"
Range("A1").CurrentRegion.Select
Buff = Range("A2", "C6").SpecialCells(xlCellTypeVisible) '一番上はフィールド名なのでA2から

フィルタがかかった状態で見えている「リンゴ」「バナナ」「ミカン」のデータだけをBuffに取り込んでいるつもりなのですが、Buffの中には1行目にかかれている「リンゴ」のデータしか入ってきません。
フィルタがかかっている時は違うデータの取り方があるのでしょうか。
よろしくお願いします。

教えて!goo グレード

A 回答 (4件)

例データ


A列   B列  C列
1ax
2by
3cz
4at
5sy
6au
7gr
8st
ーー
コード  B列がaの、C列の値を配列に
Sub test01()
Dim d(100)
Dim Buff As Variant
Cells(1, 1).AutoFilter field:=2, Criteria1:="a"
Range("A1").CurrentRegion.Select
Set Buff = Range("A1:C8").SpecialCells(xlCellTypeVisible)
For Each cl In Buff
If cl.Column = 3 Then
d(k) = cl
k = k + 1
MsgBox cl
End If
Next
End Sub
ーー
表示されるもの
X,t,u
    • good
    • 2

こんばんは。



配列というのは、全部が繋がっているものか、マトリックス(格子)になっているものだけです。
普通は、一旦、セルに貼り付けしてから、再度取り直しますが、直接、取得するなら、以下のコードのようにします。

配列に取得したものを、出力する場合は、配列が、縦横が逆に取れていますから、取得した後に、Transpose 関数で、縦横を転換する必要があります。
'-------------------------------------------

Sub Test1()
  Dim Buff() As Variant
  Dim r As Range
  Dim c As Range
  Dim d As Range
  Dim i As Long
  Dim col As Long
  Dim k As Long
  With ActiveSheet
    .Cells(1, 1).AutoFilter field:=3, Criteria1:="○"
    With .AutoFilter.Range
      Set r = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
      col = .Columns.Count
    End With
  End With
  For Each c In r.Rows
    ReDim Preserve Buff(col - 1, i)
    For Each d In c.Cells
      Buff(k, i) = d
      k = k + 1
    Next d
    k = 0
    i = i + 1
  Next c
'Range("A15").Resize(UBound(Buff, 2) + 1, col).Value = Application.Transpose(Buff)  
End Sub

'-------------------------------------------
    • good
    • 1

いやーはずしてました。


やったことはありませんがそれでいいと思っていました。
下のコードを実行してみたら
Sub Buddd()
Dim s As Variant
s = Union(Range("A1:B3"), Range("A10:B13"))
Debug.Print UBound(s, 1)
End Sub
結果は3
飛び飛びの範囲はvariantに代入すると最初の範囲しか入らないようです。
    • good
    • 0
この回答へのお礼

フィルタではなく、そういう問題があるんですね。
ちょっとアプローチを変えてみます。

できそうでできなかったので、むず痒くて^^;
ありがとうございます。

お礼日時:2009/12/09 18:04

>Buffに取り込んでいるつもりなのですが、Buffの中には1行目にかかれている「リンゴ」のデータしか入ってきません。


ちゃんと入ると思いますけど
Buffはどうやって見ています?
イミディエイトウインドで ?Buff(2,1) としてみてください。

この回答への補足

お世話になります。
イミディエイトウィンドウで入力してみたところ「インデックスが有効範囲にありません。」とメッセージが出ました。
ウォッチでも見ていたのですが、同様にBuff(2,x)以降のデータは取得できていません。

補足日時:2009/12/09 16:49
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング