Excel VBA質問箱 IV

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

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


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

【9348】ユニークな数値を数えたい。 まゆん 03/11/30(日) 15:45 質問
【9349】Re:ユニークな数値を数えたい。 INA 03/11/30(日) 16:06 回答
【9355】Re:ユニークな数値を数えたい。 まゆん 03/11/30(日) 16:58 質問
【9356】Re:ユニークな数値を数えたい。 INA 03/11/30(日) 17:51 回答
【9360】Re:ユニークな数値を数えたい。 INA 03/11/30(日) 18:02 回答
【9353】Re:ユニークな数値を数えたい。 ichinose 03/11/30(日) 16:44 回答
【9429】Re:ユニークな数値を数えたい。自己レス ichinose 03/12/4(木) 7:58 発言
【9477】Re:ユニークな数値を数えたい。自己レス bykin 03/12/4(木) 21:01 回答
【9526】Re:ユニークな数値を数えたい。自己レス ichinose 03/12/7(日) 11:28 お礼
【9357】Re:ユニークな数値を数えたい。 りん 03/11/30(日) 17:54 回答

【9348】ユニークな数値を数えたい。
質問  まゆん  - 03/11/30(日) 15:45 -

引用なし
パスワード
   あの〜。恐れ入りますもうひとつ質問させてください。
ExcelのCellの中に下記のような表があると例えます。

データ
001
003
004
001
001
004
005
006
007

上記の表でユニークな数値の数を数えたいのですがどのようにして
かぞえられますか? 上記の表を例にすると答えは6です。
同じ数字はカウントしないようにしたいのですが、Filter機能等をつかってみたりしたのですが、違う答えが返ってきます。どのVBAをつかえばよいのでしょうか?ご教示願います。

【9349】Re:ユニークな数値を数えたい。
回答  INA  - 03/11/30(日) 16:06 -

引用なし
パスワード
   Sub Sample()
Dim i As Long
Dim cnt As Long

  For i = 2 To Range("A65536").End(xlUp).Row
  
     Columns("A:A").AutoFilter _
     Field:=1, Criteria1:=Cells(i, 1).Value
    
     If ActiveSheet.UsedRange.Columns(1). _
      SpecialCells(xlCellTypeVisible).Count - 1 = 1 Then
      
      cnt = cnt + 1
     End If
    
  Next i

  ActiveSheet.AutoFilterMode = False
  
  MsgBox "ユニークなデータは、" & cnt & " 件です。"

End Sub

【9353】Re:ユニークな数値を数えたい。
回答  ichinose  - 03/11/30(日) 16:44 -

引用なし
パスワード
   こんにちは。
>あの〜。恐れ入りますもうひとつ質問させてください。
>ExcelのCellの中に下記のような表があると例えます。
>
>データ
>001
>003
>004
>001
>001
>004
>005
>006
>007
>
>上記の表でユニークな数値の数を数えたいのですがどのようにして
>かぞえられますか? 上記の表を例にすると答えは6です。
>同じ数字はカウントしないようにしたいのですが、Filter機能等をつかってみたりしたのですが、違う答えが返ってきます。どのVBAをつかえばよいのでしょうか?ご教示願います。
数だけなら、関数でも可能ですよ。
例のデータがセルA1〜A9に入っているとすると、
例えば、セルB1に
「=SUM(1/COUNTIF(A1:A9,A1:A9))」
配列を使用していますから、セルから抜けるときはEnterキーではなく
ctrl+shift+enterキーを押して下さい。
これをVBAでするなら

Sub test()
  MsgBox [=SUM(1/COUNTIF(A1:A9,A1:A9))]
End Sub
こんな方法もあります。

【9355】Re:ユニークな数値を数えたい。
質問  まゆん  - 03/11/30(日) 16:58 -

引用なし
パスワード
   INAさん
こちらも試してみましたがどうしても返ってくる回答は
CELLの数が返ってきます。
下記の内容をそのままExcellシートへあてこんで実行しましたが
ユニークな数の回答は得られませんでした。
私のやり方がおかしいのかなぁ?(涙;;)


▼INA さん:
>Sub Sample()
>Dim i As Long
>Dim cnt As Long
>
>  For i = 2 To Range("A65536").End(xlUp).Row
>  
>     Columns("A:A").AutoFilter _
>     Field:=1, Criteria1:=Cells(i, 1).Value
>    
>     If ActiveSheet.UsedRange.Columns(1). _
>      SpecialCells(xlCellTypeVisible).Count - 1 = 1 Then
>      
>      cnt = cnt + 1
>     End If
>    
>  Next i
>
>  ActiveSheet.AutoFilterMode = False
>  
>  MsgBox "ユニークなデータは、" & cnt & " 件です。"
>
>End Sub

【9356】Re:ユニークな数値を数えたい。
回答  INA  - 03/11/30(日) 17:51 -

引用なし
パスワード
   フィルタで上手くいかないとのことでしたので、
勘違いしました。
私のコードは、同じ文字のないセルをカウントするものでした。

フィルタオプションの「重複無視」をして、
その抽出したセル数をカウントしては如何でしょうか?

【9357】Re:ユニークな数値を数えたい。
回答  りん E-MAIL  - 03/11/30(日) 17:54 -

引用なし
パスワード
   まゆん さん、こんばんわ。

>あの〜。恐れ入りますもうひとつ質問させてください。
>ExcelのCellの中に下記のような表があると例えます。

>A1  データ
>A2 001
 <<略>>
>A9 006
>A10 007

>上記の表を例にすると答えは6です。
だとして。

Sub Test()
  With Range("A1:A10")
   .AdvancedFilter Action:=xlFilterInPlace, Unique:=True
   'Rangeは分断されていると一番上だけしかCountで返さなくなるので
   'Areasで全部チェックして足していく
   For Each c In .SpecialCells(xlCellTypeVisible).Areas
     RR& = RR& + c.Rows.Count
   Next
   '1行目はタイトル行なのでデータの行数は -1
   MsgBox RR& - 1, vbInformation, "Unique"
  End With
 
End Sub

ベタに数えていく場合
Sub test()
  Dim Rmax&, Rpos&, Flg As Boolean
  Rmax& = 10 'A10まで検索するとして
  Rpos& = 0
  ReDim cdat(1 To Rmax&) As Variant '内容保管用
  '
  For RR& = 2 To Rmax&
   With Cells(RR&, 1)
     If .Value <> "" Then
      Flg = True
      For NN& = 1 To Rpos&
        If cdat(NN&) = .Value Then
         Flg = False: Exit For
        End If
      Next
      'チェック後重複が無ければ配列に入れる
      If Flg = True Then
        Rpos& = Rpos& + 1
        cdat(Rpos&) = .Value
      End If
     End If
   End With
  Next
  MsgBox Rpos&, vbInformation, "Unique"
  Erase Cdat
End Sub

ichinoseさんの配列数式も面白そうですね。

【9360】Re:ユニークな数値を数えたい。
回答  INA  - 03/11/30(日) 18:02 -

引用なし
パスワード
   Sub Sample3()
  Columns(1).AdvancedFilter Action:=xlFilterInPlace, Unique:=True
  MsgBox ActiveSheet.UsedRange.Columns(1).SpecialCells(xlCellTypeVisible).Count - 1
End Sub

【9429】Re:ユニークな数値を数えたい。自己レス
発言  ichinose  - 03/12/4(木) 7:58 -

引用なし
パスワード
   おはようございます。
まゆんさんから、ツッコミがあったら、訂正しようと思っていたのですが、
トップページ落ちしそうなので自己レスです。

>Sub test()
>  MsgBox [=SUM(1/COUNTIF(A1:A9,A1:A9))]
>End Sub
↑まゆんさんの例題ですと正しい値を返してくれますが、
小数を扱ってますから、誤差が出る場合がありました。
例えば、セルA1〜A68まで全部1だった場合、
答えは当然「1」になるはずですが

MsgBox [=SUM(1/COUNTIF(A1:A68,A1:A68))]

は、「0.999999999999998」と誤差が発生しました。
セルに代入すると「1」と表示されていますが、Valueプロパティには
誤差が出ています。


MsgBox Round(([=SUM(1/COUNTIF(A1:A68,A1:A68))]), 0)

とか

MsgBox [=Round(SUM(1/COUNTIF(A1:A68,A1:A68)),0)]

にしておかないと解消されませんでした。

やっぱり、小数を扱う場合は 要注意ですね!!

【9477】Re:ユニークな数値を数えたい。自己レス
回答  bykin  - 03/12/4(木) 21:01 -

引用なし
パスワード
   こんばんわ。

▼ichinose はん:

割り算して足し算したらどうしても端数が出てまいますわなー
MSはこういう場合は FREQUENCY 関数を使うようにアナウンスしてまっせ。
http://support.microsoft.com/default.aspx?scid=kb;ja;268001&Product=excelJPN

この説明に従うと、ふつーにセルに関数を入れる場合は
=SUM(IF(FREQUENCY(A1:A9,A1:A9)>0,1,0))
を配列数式で入力しろってことになるんやけど、
実際は配列数式にする必要はありまへん(^^;;
(どっちでもOK・・・こらっ!>MS)

VBAでやる場合は、ichinose はん風やったら

Sub test()
  MsgBox [=SUM(IF(FREQUENCY(A1:A9,A1:A9)>0,1,0))]
End Sub

ってな感じかな?

試してみてな。
ほな。

【9526】Re:ユニークな数値を数えたい。自己レス
お礼  ichinose  - 03/12/7(日) 11:28 -

引用なし
パスワード
   ▼bykin さん:
こんにちは。

>VBAでやる場合は、ichinose はん風やったら
>
>Sub test()
>  MsgBox [=SUM(IF(FREQUENCY(A1:A9,A1:A9)>0,1,0))]
>End Sub
>
>ってな感じかな?
↑の方法は、私もどこかで見た事がありましたが、まゆんさんの例題が
001と書いてあったのでもしかしたら文字列かも?と思ったもので
文字列だと答えを出してくれませんよね。

でも、

>http://support.microsoft.com/default.aspx?scid=kb;ja;268001&Product=excelJPN

に、色んな方法が載っていました。
参考にさせていただきます。

ありがとうございました。

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