Excel VBA質問箱 IV

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

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


11519 / 13645 ツリー ←次へ | 前へ→

【15677】データの顔ぶれ抽出 西武池袋線 04/7/2(金) 10:55 質問[未読]
【15678】Re:データの顔ぶれ抽出 Asaki 04/7/2(金) 10:57 回答[未読]
【15680】Re:データの顔ぶれ抽出 西武池袋線 04/7/2(金) 11:13 質問[未読]
【15681】Re:データの顔ぶれ抽出 Asaki 04/7/2(金) 11:17 回答[未読]
【15683】Re:データの顔ぶれ抽出 西武池袋線 04/7/2(金) 11:45 質問[未読]
【15685】Re:データの顔ぶれ抽出 Asaki 04/7/2(金) 12:04 回答[未読]
【15686】Re:データの顔ぶれ抽出 Asaki 04/7/2(金) 12:17 発言[未読]
【15687】Re:データの顔ぶれ抽出 西武池袋線 04/7/2(金) 12:33 質問[未読]
【15688】Re:データの顔ぶれ抽出 Asaki 04/7/2(金) 12:41 回答[未読]
【15689】Re:データの顔ぶれ抽出 西武池袋線 04/7/2(金) 13:08 質問[未読]
【15690】Re:データの顔ぶれ抽出 Asaki 04/7/2(金) 13:38 回答[未読]
【15691】Re:データの顔ぶれ抽出 西武池袋線 04/7/2(金) 14:32 お礼[未読]

【15677】データの顔ぶれ抽出
質問  西武池袋線  - 04/7/2(金) 10:55 -

引用なし
パスワード
   ある列のデータの種類を求めたいのですが、
さっぱり手がつけられません。
どなたか教えてください。
よろしくお願いします。

データ:
  A列 B列
   1  A
   1  B
   2  A
   2  B
   1  A
   3  B
   2  A

結果:
  A列:1,2,3
  B列:A,B
  (別にA列、B列両方を同時に求めなければいけない訳ではないです。)

【15678】Re:データの顔ぶれ抽出
回答  Asaki  - 04/7/2(金) 10:57 -

引用なし
パスワード
   こんにちは。

タイトル行が必要になりますが、フィルタオプションの「重複を無視する」を利用してはいかがでしょうか?
それぞれの列ごとに行います。

【15680】Re:データの顔ぶれ抽出
質問  西武池袋線  - 04/7/2(金) 11:13 -

引用なし
パスワード
   ▼Asaki さん:
早速のご回答ありがとうございます。

>タイトル行が必要になりますが、フィルタオプションの「重複を無視する」を利用してはいかがでしょうか?
>それぞれの列ごとに行います。
 実は、求めた顔ぶれをテーブルに退避しておき、
 その内容でフィルタリングして、結果を印刷しようと考えています。
 要するにデータの顔ぶれ単位で紙に印刷したいのです。
 多分、フィルタオプションの「重複を無視する」を利用してしまうと、
 全て1行しか出てこないかな??(想像ですみません)

 やりたい事の途中までしか説明せずにすみませんでした。

よろしくお願いします。

【15681】Re:データの顔ぶれ抽出
回答  Asaki  - 04/7/2(金) 11:17 -

引用なし
パスワード
   >全て1行しか出てこないかな??(想像ですみません)
意味不明です。

一旦、フィルタオプションの重複を無視するで、それぞれの列のリストを抽出して、配列に格納
これをループして印刷
すればよいことでは?

【15683】Re:データの顔ぶれ抽出
質問  西武池袋線  - 04/7/2(金) 11:45 -

引用なし
パスワード
   ▼Asaki さん:
>一旦、フィルタオプションの重複を無視するで、それぞれの列のリストを抽出して、配列に格納
>これをループして印刷
>すればよいことでは?
 実際にオプションで顔ぶれはでました。ありがとうございます。
 ここでさらに、求まったものをテーブルにセットするやり方がわかりません。
 (列のリストを抽出する作業)
 お手数をかけてすみませんが、
 重複無視で求まった顔ぶれをテーブル格納するところの記述を教えていただけますか?

よろしくお願いします。

【15685】Re:データの顔ぶれ抽出
回答  Asaki  - 04/7/2(金) 12:04 -

引用なし
パスワード
   >テーブル
というのが配列のことだと解釈して、A列の場合は1行目のタイトル行を除いて
Dim a    As Variant
a = Range(Cells(2, 1), Cells(2, 1).End(xlDown)).Value
a は 2次元で、各要素ともインデックスは1から始まります。

各列に抽出された全組み合わせを考えるとすると、
各列ごとに別々の配列を利用して、ループをネストすることになりそうで、
ちょっと大変そうですね。。。

【15686】Re:データの顔ぶれ抽出
発言  Asaki  - 04/7/2(金) 12:17 -

引用なし
パスワード
   データが1件しか抽出されていない場合の考慮が不足していました。

Dim a    As Variant
With Range(Cells(1, 1), Cells(1, 1).End(xlDown))
  a = .Resize(.Rows.Count - 1).Offset(1).Value
End With

【15687】Re:データの顔ぶれ抽出
質問  西武池袋線  - 04/7/2(金) 12:33 -

引用なし
パスワード
   ▼Asaki さん:
>>テーブル
>というのが配列のことだと解釈して、A列の場合は1行目のタイトル行を除いて
>Dim a    As Variant
>a = Range(Cells(2, 1), Cells(2, 1).End(xlDown)).Value
>a は 2次元で、各要素ともインデックスは1から始まります。
>
>各列に抽出された全組み合わせを考えるとすると、
>各列ごとに別々の配列を利用して、ループをネストすることになりそうで、
>ちょっと大変そうですね。。。
 ありがとうございます。もうちょっとでした。
 抽出するのは今のところ1列しか考えていません。
 aの値ですが重複排除していても、隠れているセルの内容を
 取得してしまいます。
 (画面上1,2,3であっても、a(1,1)は1、a(2,1)は1、a(3,1)は1、a(4,1)は2
  のように入っていました)

【15688】Re:データの顔ぶれ抽出
回答  Asaki  - 04/7/2(金) 12:41 -

引用なし
パスワード
   よく考えたら、1つしか抽出されなかった場合は、配列になりませんでした。
Dim a    As Variant
With Range(Cells(1, 1), Cells(1, 1).End(xlDown))
  With .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible)
    If .Count = 1 Then
      ReDim a(1 To 1, 1 To 1)
      a(1, 1) = .Value
    Else
      a = .Value
    End If
  End With
End With

> aの値ですが重複排除していても、隠れているセルの内容を
> 取得してしまいます。
てっきり、別の位置に抽出しているのかと思い込んでいました。
その辺も、↑考慮しているつもりです。

【15689】Re:データの顔ぶれ抽出
質問  西武池袋線  - 04/7/2(金) 13:08 -

引用なし
パスワード
   ▼Asaki さん:
>よく考えたら、1つしか抽出されなかった場合は、配列になりませんでした。
>Dim a    As Variant
>With Range(Cells(1, 1), Cells(1, 1).End(xlDown))
 この部分はヘッダーも含めるということですか?
>  With .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible)
>    If .Count = 1 Then
>      ReDim a(1 To 1, 1 To 1)
>      a(1, 1) = .Value
>    Else
>      a = .Value
>    End If
>  End With
>End With
msgbox a(1, 1)
msgbox a(2, 1)
msgbox a(3, 1)
msgbox a(4, 1)を追加して中身を確認しようとしたところ
msgbox a(1, 1)で、「型が一致しません」とエラーになってしまいました。

【15690】Re:データの顔ぶれ抽出
回答  Asaki  - 04/7/2(金) 13:38 -

引用なし
パスワード
   ごめんなさい。
そういえば、不連続セル範囲はそのまま配列に格納できませんでした。

抽出先を、一旦別の位置にするか
自分でループして配列に格納するかのいずれかですね。

Sub test()
  Dim a    As Variant
  Dim c    As Range
  Dim i    As Long

  With Range(Cells(1, 1), Cells(1, 1).End(xlDown))
    With .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible)
      ReDim a(1 To .Count)
      
      i = 1
      For Each c In .Cells
        a(i) = c.Value
        i = i + 1
      Next c
    End With
  End With

  For i = 1 To UBound(a)
    MsgBox "a(" & i & ")= " & a(i)
  Next i

End Sub
配列は1から始まる1次元にしました。

【15691】Re:データの顔ぶれ抽出
お礼  西武池袋線  - 04/7/2(金) 14:32 -

引用なし
パスワード
   ▼Asaki さん:
配列が1次元になりより分かり易くなりましたし、
なにより正しく動きました。
本当にありがとうございました。

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