2

私はVBAを初めて使用しますが、PHPプログラミングロジックとさまざまな統計プログラミング構文の経験があります。一連のセル範囲で特定の値を検索するコードを作成しようとしています。その値が範囲内に存在する場合は、配列に1を挿入し、0を挿入しない場合は。

私のデータは次のようになります。

**Item  R1  R2**
1121    1   3
1121    2   
1121        
1121    3   2
1121    3   
1122    4   5
1122    3   5
1122    5   
1122    4   
1122    5   

私の最終目標は、配列内の値を合計し、各評価でアイテムの総数をカウントできるようにすることです。たとえば、上記のサンプルでは、​​次のように作成できるようにしたいと思います。

評価が1のアイテムの数=1

評価2=1のアイテムの数

評価3=2のアイテムの数

等々。

私が書いたコードは次のとおりです。

Sub Items()

    Dim myArray() As Variant
    Dim i As Integer
    Dim k As Integer
    i = 0
    k = 0
    R5 = Range("G(2+k):H(6+k)")
    mycount = Application.WorksheetFunction.Sum(myArray)


    Sheets("Operational").Select

    For Each R5 In Range("G2:H206")
        ReDim myArray(0 To i)
        myArray(i) = Cell.Value
        i = i + 1
        k = k + 4

        R5.Select
        If R5.Value = "1" Then
            myArray(i) = 1
        Else
            myArray(i) = 0
        End If
    Next

End Sub

アイテムごとに5行あるので、これを繰り返しの一貫したループとしてアプローチできると思いました。ただし、実行しようとすると「アプリケーション定義またはオブジェクト定義のエラー」というエラーが発生します。

私はこれがおそらく最善の方法ではないことを知っています、そして私はこれにとても慣れていないので、トラブルシューティングのどこから始めればよいのかわかりません。どんな助けでも大歓迎です。

また、誰かがVBA構造/コードまたは初心者向けチュートリアルの良いリファレンスを持っているなら、私に知らせてください!私は良い参考文献を見つけるのにあまり運がありませんでした。

4

2 に答える 2

2

私があなたが正しく求めていることを読んだ場合、VBAなしでこれを非常に簡単かつはるかに簡単に行うことができます。

ここにソリューションのスクリーンショットがあります。

列H:Kは、各アイテムの各評価列でCountIfを実行します(数式バーを参照)。列Gは、各評価のH:Kの単純な合計です。

ここに画像の説明を入力してください

アップデート

アイテムごとの評価を反映するために、非VBAアプローチは次のようになります。

ここに画像の説明を入力してください

おそらく、これを再配置または変更して、よりきれいにすることができます。また、アイテム番号を新しい範囲にコピーし、重複の削除(XL2007以降)または[高度なフィルター]> [一意の値](XL2003)を使用して、アイテム番号の一意のリストを取得できます。また、XL 2003を使用している場合、CountIFは機能しないため、= Count(If(配列数式。必要に応じて説明できます。

于 2012-06-27T16:09:58.807 に答える
1

これを機能させるには、いくつか変更する必要があります。以下のコードにコメントを変更/追加しました...

Option Explicit ' Helps with ensuring all variables are declared correctly.

' Need to add reference to 'Microsoft Scripting Runtime' when using Scripting.Dictionary

Sub Items()

Dim Ratings As Range
Dim cell As Range
Dim ItemTracking As New Scripting.Dictionary
Dim DictKey As Variant

    ' Use SET to assign objects
    Set Ratings = ActiveSheet.Range("B2:H206") ' The Range takes (in this case) a complete STRING argument, which can be manipulated with variables through concatenation with '&'.

    For Each cell In Ratings ' First column is R1, second is R2, etc.
        If Len(Trim$(ActiveSheet.Range("A" & cell.Row).Value)) > 0 Then ' Make sure we actually have an item before continuing...
            If Val(cell.Value) > 0 Then ' Make sure we have a rating before continuing...
                DictKey = Trim$(ActiveSheet.Range("A" & cell.Row).Value) & "R" & cell.Column - 1 & "V" & Val(cell.Value) ' If you need a more descriptive output than '1121 R1V1`, then just change this to match. Be careful of the string concatenation/variable usage.
                If ItemTracking.Exists(DictKey) Then ' When using a Dictionary (versus a Collection), we have the nifty Exists() function to help us see if we already have something.
                    ' If we do, add to it...
                    ItemTracking.Item(DictKey) = ItemTracking.Item(DictKey) + 1
                Else
                    ' Else, we do not, add it to the Dictionary.
                    ItemTracking.Add DictKey, 1
                End If
            End If
        End If
    Next

    For Each DictKey In ItemTracking
        Debug.Print DictKey & " - " & ItemTracking.Item(DictKey)
    Next

End Sub

私はScripting.Dictionaryこれを取得するためにを使用しました。使用するには、ライブラリを参照する必要がありますMicrosoft Scripting Runtime(コードのコメントを参照)。これはあまり役に立ちません。結果をすぐにウィンドウに出力するだけですが、必要なものを取得するように変更できます。

于 2012-06-27T13:19:12.087 に答える