-1

ユーザーが「開始日」と「終了日」の日付を入力して、ユーザーが選択した日付範囲に対応するデータを検索できるユーザーフォームがあります。スプレッドシートでは、日付は列 A にあり、列 W までの各行の次の列には、その日付に対応する一連のデータがあります。これらの 2 つの日付を取得して見ることができるコードを開発しようとしています。列 A に入力した日付範囲に該当する日付を持つ行のみで、指定された範囲内の日付を持つ行内の各列の回答をカウントします。次に、同じワークブック内の別のワークシートで、各応答のカウントの特定のセルにカウント値を入れたいと思います。可能な応答列ごとに 6 つの応答が定義されています。

かなり複雑に聞こえるかもしれませんが、これが私の最善の要約です。私はオートフィルターなどを使用することにオープンですが、それは vba を使用して行う必要があり、オートフィルターを使用する場合は、サブの最後でオートフィルター前の画面に戻す必要があります。

編集:

OK、私はあまり明確ではなかったと思います。最初の質問に対して、なぜ W になるのかというと、この分析に必ずしも関連しない各行に関連付けられた他の項目がいくつかあるためです。関連するデータ応答を含む列は列 D から W です。各行に入力される日付は 1 つだけで、それは列 A にあります (列 B と C は無視/スキップできます)。各列 (この場合はアンケートの質問) には、入力可能な 6 つの定義済み回答があります。

したがって、たとえば、D3 は「強く同意する」、「やや同意する」、「やや同意しない」、「まったく同意しない」、「回答なし」、または「わからない/該当しない」と言うことができます。これは、各列に関連付けられたすべての質問に当てはまります。したがって、指定された 2 つの日付 (範囲の開始日と終了日) 内にある日付を含む行を取得し、その行を横切って D 列から W 列まで見て、6 の数を数えられるようにしたいと考えています。各列 (または「質問」) の可能な応答 (上記)。次に、各列内の考えられる各応答のカウント値を、別のワークシート (この場合は Sheet3) の特定のセルにコピーしたいと考えています。

はい、指定された日付範囲内にある列 A の応答をフィルター処理し、列の日付基準を満たす行の 16 列のそれぞれについて、考えられる応答ごとに countif を実行する必要があると言いたかったのです。 A. それは理にかなっていますか?

私はあらゆる種類の高度なフィルターまたはオートフィルターを使用できますが、ユーザーフォームで指定された 2 つの日付に基づいて列 A の日付を並べ替える他のアイデアがある場合は、16 の質問列に対応する行を見て、各質問に対する 6 つの可能な回答のそれぞれの数を計算し、その数を別のワークシート (シート 3) の指定されたセルに入力します。

オートフィルターを試行した後、各列の可能な応答ごとにcountifとしてコピーアンドペーストしようとしましたが、実際にはフィルター処理していませんでした。たとえ私がそれを機能させたとしても、これは最も効率的な方法ではないようです。私のコーディング試行の例として、1 つの列に対する 2 つの応答のコードを次に示します (完全なコードは、15 列に対して 6 つの可能な応答を説明するため、ここに含めるには長すぎるように思われます)。

 Private Sub cbOkDateEnter_Click()

Dim ws As Worksheet
    Set ws1 = ThisWorkbook01.Sheets("Sheet1")

With Range("A1:W" & lr)
    .AutoFilter Field:=1, Criteria1:=">=" & tbEnterDate01, Operator:=xlAnd,          Criteria2:="<=" & tbEnterDate02

Dim sum01a, sum01b as Variant

sum01a = Application.WorksheetFunction.CountIf(Sheets("Sheet1").Range("D2:D5000"),     "Strongly disagree")
    Worksheets("Sheet3").Range("J12").Value = sum01a
sum01b = Application.WorksheetFunction.CountIf(Sheets("Sheet1").Range("D2:D5000"), "Somewhat disagree")
    Worksheets("Sheet3").Range("J13").Value = sum01b
End Sub

どんな助けでも大歓迎です!ありがとう!

4

2 に答える 2

0

ユーザーフォームの OK ボタンが CommandButton1 で、to と from のテキストボックスが ToDateBox と FromDateBox である場合、このようなものが機能する可能性があります。bwlow はユーザーフォーム コード モジュールに入ります。

Private Sub CommandButton1_Click()

Dim CountOpt1, CountOpt2, CountOpt3, CountOpt4, CountOpt5, CountOpt6 As Long

Dim DateArray() As Variant
Dim DateRange As Range

Dim DateStart, DateEnd As String

Dim DateCount, ColCount As Double

' Sort your data in date order so the range you're searching for is contiguous

    Sheets("Sheet1").UsedRange.Columns.Sort key1:=Range("A2"), Header1:=xlYes, order1:=xlAscending

' Set the formatting on the output from your userform
' This works for me, but you'll have to figure out how your dates are formatted so the macro can find them...
    DateStart = Format(FromDateBox.Value, ddmmyyyy)
    DateEnd = Format(ToDateBox.Value, ddmmyyyy)

' Set the width of your range to the ColCount variable
    ColCount = Sheets("Sheet1").UsedRange.Columns.Count

' Set the height of your range to the DateCount variable depending on instances of dates between your input range
    DateCount = Application.WorksheetFunction.CountIfs(Range("Sheet1!A:A"), _
    ">=" & DateStart, Range("Sheet1!A:A"), "<=" & DateEnd)


' Find earliest occurence of start date and set it to the DateRange variable
    Do While DateRange Is Nothing
        With Sheets("Sheet1").Range("A:A")
            Set DateRange = .Find(What:=DateStart, _
            After:=.Cells(.Cells.Count), _
            LookIn:=xlValues, _
            LookAt:=xlWhole, _
            SearchOrder:=xlByRows, _
            SearchDirection:=xlNext, _
            MatchCase:=False)
                If DateRange Is Nothing Then
                    DateStart = DateAdd("d", 1, DateStart)
                    DateStart = Format(DateStart, ddmmyyyy)
                End If
        End With
    Loop

' Expand the DateRange variable to exclude the dates (and columns B & C with unrelated data)
' and then encompass all the rows within your target date range
    Set DateRange = DateRange.Offset(0, 3)
    Set DateRange = DateRange.Resize(DateCount, ColCount - 3)

' Add the DateRange to a 2D array
    DateArray = DateRange

' Loop through the array counting instances of your answers
For Each c In DateArray
    If c = "Strongly Agree" Then CountOpt1 = CountOpt1 + 1
    If c = "Somewhat Agree" Then CountOpt2 = CountOpt2 + 1
    If c = "Somewhat Disagree" Then CountOpt3 = CountOpt3 + 1
    If c = "Strongly Disagree" Then CountOpt4 = CountOpt4 + 1
    If c = "No Response" Then CountOpt5 = CountOpt5 + 1
    If c = "Not Sure/Not Applicable" Then CountOpt6 = CountOpt6 + 1
Next c

' Activate the sheet you want to dump the counts
Sheets("Sheet3").Activate

' Put the counts wherever you want - for example
Range("A1") = "Option 1"
Range("B1") = CountOpt1
Range("A2") = "Option 2"
Range("B2") = CountOpt2
Range("A3") = "Option 3"
Range("B3") = CountOpt3
Range("A4") = "Option 4"
Range("B4") = CountOpt4
Range("A5") = "Option 5"
Range("B5") = CountOpt5
Range("A6") = "Option 6"
Range("B6") = CountOpt6

' Unload the userform if you want
Unload Me

End Sub

試してみてください..日付を扱うのは少し面白いかもしれませんが、ユーザーフォームから取り込まれ、変数に割り当てられる日付が、検索している範囲の日付と同じ形式であることを確認する必要があります。それはいくつかの本当に賢明な結果をもたらす可能性があります...

于 2014-08-25T23:47:49.953 に答える