2017-02-02 14 views
1

列Aの単語を読み取るマクロを書きたいとします。および B例えば、あなたが見ることができる列Aに「列D」が含まれ、列Bに「列E」が含まれている場合THEN加算値

enter image description here

それぞれ F、その後、は、例えば列G.

に列Cに値を追加します列Aと列Bには「ライオン」と「馬」の2つのインスタンスがあるため、列Gには2つの合計(10 + 8 = 18)があります。

残念ながら

、私はG列にだけコピーC列から値を作ったの試み:私は「X」(そしておそらく他の多くのもの)と間違って何かをやっている知っている

Sub CombineAnimals() 

lastRow = Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row 

For x = 1 To lastRow 
    If InStr(1, Sheets("Sheet1").Cells(x, 1), Cells(x, 5)) <> 0 _ 
    And InStr(1, Sheets("Sheet1").Cells(x, 2), Cells(x, 6)) <> 0 Then 
     Sheets("Sheet1").Cells(x, 7).Value = _ 
     Sheets("Sheet1").Cells(x, 7).Value + Cells(x, 3) 
    End If 
Next x 

End Sub 

が、私はそれを動作させる方法を理解できません。これを変更する方法はありますか?それで、私の例の画像と同じように合計が加算されますか?

ご協力いただきありがとうございます。

+2

ピボットテーブルは、はるかに簡単です。 – Rory

+0

Roryに感謝します。ピボットテーブルはこれで本当にうまく動作しますが、私は実際のデータにいくつかのステップと他のいくつかのカラムを持っています(私はここで質問の目的のために少し簡略化しました)。代わりにVBAを使用できます。高速応答のおかげで非常に感謝! – Antony

+3

(必要に応じてVBAで)SUMIFS式はどうなりますか? – SJR

答えて

3

それがマクロであることを持っていますか?あなただけのG2へ=SUMIFS(C:C,A:A,E2,B:B,F2)に入れ、フィルダウンできます

enter image description here

あなたが本当にマクロでこれを持っているしたい場合は、それはこのようなものになるだろう:あなたが使用できる場合は

Sub CombineAnimals() 

    Range("G2").FormulaR1C1 = "=SUMIFS(C[-4],C[-6],RC[-2],C[-5],RC[-1])" 
    Range("G2").AutoFill Destination:=Range("G2:G" & Range("F" & ActiveSheet.Cells.Rows.Count).End(xlUp).Row) 

End Sub 
+0

私はこれを考えなかったと信じられない!私は本当にそれを思っていた。皆様のおかげで多くのおかげです。 – Antony

+0

@AntonyBagott心配はありません - 時々それはあなたの顔を見つめています:) – Jeremy

+0

VBAの式が華麗であると言うことを得た!私はこれまでにこの種の表記法を見たことがありません(私はVBAに比較的新しいです)。もし私がこれをしなければならないなら、私は[Roryの公式](http:// stackoverflow。com/a/42001419/6352151)、これははるかにエレガントです –

1

このような何かが動作しますが、それは少しやり過ぎかもしれないが:

あなたは文字列の最初の二つのセルを連結し、この文字列が辞書のキーとして使用されます。 次に、類似したものが見つかるとその値を辞書に追加します。最後に、辞書を印刷することができます。

Option Explicit 

Public Sub TestMe() 

    Dim dict   As Object 
    Dim rngCell   As Range 

    Dim rngInput  As Range 
    Dim strInput  As String 
    Dim dblInput  As Double 
    Dim lngCounter  As Long 
    Dim varKey   As Variant 

    Set dict = CreateObject("Scripting.Dictionary") 
    Set rngInput = ActiveSheet.Range("A2:A6") 


    For Each rngCell In rngInput 
     strInput = rngCell.Value & rngCell.Offset(0, 1).Value 
     dblInput = rngCell.Offset(0, 2).Value 

     If dict.exists(strInput) Then 
      dict(strInput) = dict(strInput) + dblInput 
     Else 
      dict.Add strInput, dblInput 
     End If 
    Next rngCell 


    For Each varKey In dict.keys 
     Debug.Print varKey, dict(varKey) 
    Next varKey 


End Sub 
+0

それは非常にそれをやって周りの長い道です! – Jeremy

+0

@ジェレミー - 私が言ったように、それは少し過度のことです。しかし、それは数式の解に大きな違いがあります。あなたが 'LionHorse'を' HorseLion'と同じように扱いたいと想像してください。いくつかの行を追加すれば、簡単に手に入れることができます。 – Vityata

2

、シンプルSUMIFSループが動作するはずですしない正当な理由がない限り:

Sub CombineAnimals() 
With Sheets("Sheet1") 
    lastRow = .Range("E" & .Rows.Count).End(xlUp).Row 

    For x = 2 To lastRow 
     .Cells(x, "G").Value = Application.SumIfs(.Range("C:C"), .Range("A:A"), .Cells(x, "E"), .Range("B:B"), .Cells(x, "F")) 
    Next x 
End With 
End Sub 
関連する問題