- ベストアンサー
検索し、集計をTextboxに
お世話になります。 A B 1 ビール 1300 2 焼酎 500 3 ジュース 300 4 ウィスキー2000 A列のビールとウィスキーの値のみを 合計しUserFoamのTextboxに表示したいのですが 検索するには、Findを使うのでしょうか? A列に重複データは、ありません。 アドバイスをお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 それは、SUMIF でよいのでは? エラーをはじき出すために、Application.SumIf にしてあります。 Excel 2007 なら、SumIf は、一つにつなげてしまってよいです。 実際は、Const N1, Const N2 は、TextBox などの代入値にしてもよいです。 Private Sub CommandButton1_Click() Dim r As Range Dim ret As Variant Const N1 As String = "ビール" Const N2 As String = "ウィスキー" Set r = Range("A1", Range("A65536").End(xlUp)) ret = Application.SumIf(r, N1, r.Offset(, 1)) ret = ret + Application.SumIf(r, N2, r.Offset(, 1)) If Not IsError(ret) Then TextBox1.Value = ret End If Set r = Nothing End Sub
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
エクセルVBAの質問ですよね。 重複が絶対無いのなら 検索一般のロジックの質問になるわけですね。 (1)全行総なめ 該当(条件)が2つぐらいなら、ORで1度に聞ける (2)Findメソッド 重複ないなら1度の探索でやめる。 するとVBAのコードとしては1行で済む。 例 Sub test01() MsgBox Range("a1:A10").Find(what:="a").Row End Sub 値段はOffset(0,1) Sub test01() MsgBox Range("a1:A10").Find(what:="a").Offset(0, 1) End Sub aは質問では"ビール"。 これを"ウイスキ"にも行い、2つの値を足す。 (3)Application。WorksheetFunctionのMatch,Vlookup 関数で所在の行番号を求める (4)商品名でソートし(またはソートした逆ファイル範囲を使い)、2分探索など ーー (2)(3)辺りが素直な方法かな。
お礼
アドバイス、有り難うございます。 お勧めの(2)(3)で、やって見ます。
- mitarashi
- ベストアンサー率59% (574/965)
最近検索に凝っていますので作成してみました。ご参考まで。 重複対応しています。 足し算出来ない場合等のエラー処理はしていません。Findの実行時エラーが、何故か関数側で捕捉できない部分だけ処置しています。 Sub test() Dim targetRange As Range Dim sumValue As Double Dim matchwords As Variant Dim myArea As Range, myCell As Range, resultRange As Range matchwords = Array("ビール", "ウィスキー") Set targetRange = Intersect(ActiveSheet.Columns("a"), ActiveSheet.UsedRange) Set resultRange = findAll(targetRange, matchwords, xlWhole) If Not resultRange Is Nothing Then For Each myArea In resultRange.Areas For Each myCell In myArea.Cells sumValue = sumValue + myCell.Offset(0, 1).Value Next myCell Next myArea End If Debug.Print sumValue End Sub '検索範囲と、検索語(任意個数)を与えて、hitしたセル群を戻す Private Function findAll(targetRange As Range, matchwords As Variant, findMode As Variant) As Range Dim resultRange As Range, tempRange As Range Dim i As Long For i = LBound(matchwords) To UBound(matchwords) On Error Resume Next Set tempRange = myFind(targetRange, matchwords(i), findMode) On Error GoTo 0 If Not resultRange Is Nothing Then If Not tempRange Is Nothing Then Set resultRange = Union(resultRange, tempRange) Else If Not tempRange Is Nothing Then Set resultRange = tempRange End If Next i Set findAll = resultRange End Function 'findでhitしたセル群を戻す Private Function myFind(target As Range, findValue As Variant, findMode As Variant) As Range Dim c As Range Dim firstAddress As String With target Set c = .Find(findValue, LookIn:=xlValues, Lookat:=findMode, MatchCase:=False, MatchByte:=False) If Not c Is Nothing Then firstAddress = c.Address Do If myFind Is Nothing Then Set myFind = c Else Set myFind = Union(c, myFind) End If Set c = .FindNext(c) Loop While Not c Is Nothing And c.Address <> firstAddress End If End With End Function XL2000用コードです。上位バージョンの実行環境は有しないので動かない場合はご容赦を。
お礼
コード、有り難うございます。 解らないところもあるので、ヘルプで 調べたいと思います。
- n-jun
- ベストアンサー率33% (959/2873)
>A列のビールとウィスキーの値のみを どのように条件を与えるかは抜きにして、行数によってはループでもいいのでは? 或いはワークシート関数を使うとか。 (Index,Match等々)
お礼
Index,Matchを調べてみます。 有り難うございました。
お礼
SumIfで、出きるのですね! 難しく考えていて、どのように コードを作ればいいか、解りませんでした。 Wendy02さん 有り難うございました。