[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ある条件に合う値(あるいは値のあるセル)を数え、全シートに適用する』(駅前)
具体的な質問です。
以下の例のようにBの列にURLがたくさん記載されています。URLの直前にType からTypeDまでの4種のタイプが記載されており、URLはこれで分類されています。このType AとType B、Type C、Type Dに含まれるURLの数を自動的に計算し、C1、C2、C3、C4に数を挿入したいのです。そして、これを100件ある全シートで同じ処理を行いたいのです。いい方法がありますでしょうか?
ちょっと難しいのは、TypeABCDの出現の有無はランダムです(ただしABCDの順序は不動です)。つまり、シート2のようにTypeAがない場合やURLが一つもない(空白)シートというのもありえます。その場合もC1、C2、C3、C4に0を挿入したいのです。ちなみに、あまり重要ではないでしょうが、URLは重複する可能性もあります。URLはhttpとhttpsしかないと思います。マクロでもかまいませんので、お願いします。
シート1
A B 1 Type A 2 http://example.com 3 https://sample.com 4 Type B 5 https://abc.com 6 http://efg.com 7 https://hij.com 8 Type C 9 https://hij.com 10 Type D 11 https://klm.com
この場合、C1に2、C2に3、C3に1、C4に1を挿入します
シート2
A B 1 Type B 2 https://abc.com 3 http://efg.com 4 https://hij.com 5 Type C 6 https://hij.com
この場合、C1に0、C2に3、C3に1、C4に0を挿入します
シート3
A B 1 2 3 4
この場合、C1に0、C2に0、C3に0、C4に0を挿入します
< 使用 Excel:Excel2016、使用 OS:Windows10 >
>URLは重複する可能性もあります。 これは重複するURLは一つとするのだろうか? (ねむねむ) 2019/07/17(水) 09:03
ああ、例から見るとタイプが違っておなじURLがあるということか? それとも同じタイプ内で重複があるのだろうか? で、もし同じタイプ内の重複がある場合、どう数えるのだろうか? (ねむねむ) 2019/07/17(水) 09:08
もう一つ質問。 Type内のURLの個数は最大何個だろうか? (ねむねむ) 2019/07/17(水) 09:21
    Dim dt(3) As Long, c As Range, r As Range
    For Each c In Range("B:B").SpecialCells(2)
        If Left(c.Value, 4) = "http" Then
            Set r = Range(Range("B1"), c).Find("Type", , , xlPart, , xlPrevious)
            If Not r Is Nothing Then
                Select Case r.Value
                    Case "Type A": dt(0) = dt(0) + 1
                    Case "Type B": dt(1) = dt(1) + 1
                    Case "Type C": dt(2) = dt(2) + 1
                    Case "Type D": dt(3) = dt(3) + 1
                End Select
            End If
        End If
    Next c
    Range("C1:C4").Value = WorksheetFunction.Transpose(dt)
End Sub
(mm) 2019/07/17(水) 09:53
>このType AとType B、Type C、Type Dに含まれるURLの数を自動的に計算し、C1、C2、C3、C4に数を挿入したい >のです。そして、これを100件ある全シートで同じ処理を行いたいのです。いい方法がありますでしょうか?
 Sub test()
     Dim a, ws As Worksheet, x, i As Long, n, s As String
     For Each ws In Worksheets
         x = Filter(ws.[transpose(if(left(b1:b10000,4)="Type",row(1:10000)))], False, 0)
         ReDim a(1 To 4, 1 To 1) As Long
         If UBound(x) > -1 Then
             ReDim Preserve x(UBound(x) + 1)
             x(UBound(x)) = ws.Range("b" & Rows.Count).End(xlUp)(2).Row
             For i = 0 To UBound(x) - 1
                 s = Right$(Trim$(ws.Cells(x(i), 2)), 1)
                 n = Switch(s = "A", 1, s = "B", 2, s = "C", 3, s = "D", 4)
                 If Not IsNull(n) Then a(n, 1) = x(i + 1) - x(i) - 1
             Next
         End If
         ws.[c1:c4] = a
     Next
 End Sub
(seiya) 2019/07/17(水) 10:34
 とりあえず同一Type内に重複URLがないとする。
 まず、シートタブを右クリックしてすべてのシートを選択。
 その状態でC1セルに
 =SUMPRODUCT((COUNTIF(INDIRECT("B1:B"&ROW($1:$100)),"Type*")*(LEFT(B$1:B$100,4)="http")=ROW(A1))*1)
 と入力してC4セルまでフィルコピー。
 これですべてのシートのC1セルからC4セルに式が入力される。
(ねむねむ) 2019/07/17(水) 10:37
なお上記式はB列のデータが最大100行までに対応している。 もっと行があるときは式中の$100を大きくしてくれ。 (ねむねむ) 2019/07/17(水) 10:38
すまない。 これだとTypeAがない場合C1セルにTypeBの個数を出してしまう。 上記の私の回答は無視してくれ。
(ねむねむ) 2019/07/17(水) 10:40
D列を作業列として使う。 全シートを選択した状態でD1セルに =IF(B1="","",IF(LEFT(B1,4)="Type",RIGHT(B1,1),OFFSET(D1,-1,))) と入力して下へフィルコピー。 C1セルに =MAX(0,COUNTIF(D:D,CHAR(64+ROW(A1)))-1) と入力してC4セルまでフィルコピーで。 (ねむねむ) 2019/07/17(水) 10:48
いろいろ方法はあるかと思いますが、シンプルさとわかりやすさで、今回はmmさんのコードを採用させていただきました。本当にありがとうございます。ほかの皆さんのコードも参考にさせていただきました。それぞれ勉強になりました。ありがとうございます。
Sub main()
    Dim dt(3) As Long, c As Range, r As Range
    For Each c In Range("B:B").SpecialCells(2)
        If Left(c.Value, 4) = "http" Then
            Set r = Range(Range("B1"), c).Find("Type", , , xlPart, , xlPrevious)
            If Not r Is Nothing Then
                Select Case r.Value
                    Case "Type A": dt(0) = dt(0) + 1
                    Case "Type B": dt(1) = dt(1) + 1
                    Case "Type C": dt(2) = dt(2) + 1
                    Case "Type D": dt(3) = dt(3) + 1
                End Select
            End If
        End If
    Next c
    Range("C1:C4").Value = WorksheetFunction.Transpose(dt)
End Sub
ちなみに、これは1シートのみで有効な手段なので、全シートに適用するために、以下の単純なコードを追加しました。
Sub urlall()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Activate
main
Next
End Sub
(駅前) 2019/07/17(水) 21:45
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
 Modified by kazu.