• 締切済み

エクセルのVBについて質問です。

<例> エクセルのシート(1)の各セルに以下の様にある場合。      数量  形状  みかん 1   個  リンゴ 2   個  なす  3   個  いも  4   個 シート(2)に以下の様にまとめるにはどの様なvbを組めばよいでしょうか      数量  形状  果物  3   個    野菜  7   個   *なにぶん初心者なので・・。  尚、vbで組みたいので宜しくお願いします。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

#5 の補足させていただきます。 読み直してみたら、あまり、品の良い書き方ではありませんでしたので、少し補足させていただきます。実務上で、#5 のようなコードを書くことは、あまりないだろうなって思って書いたまでです。あえて、VBAを所望される理由は、それは規模が大きいのではないか、と思うからです。 実務上の問題を交えて質問の補足をしてくださると、もう少し違ったものになるだろうと思います。#5で、関数処理というサンプルを示しましたが、だいたい、2~3000行程度ぐらいまでは、問題なく関数処理できるだろうと思います。それ以上のものについて、#5のVBAのコードのようなスタイルが良いのかもしれませんが、あまり大きなものには向いていないのではないか、と思っています。VBAは、比較的中規模(~3万行程度)な処理に向いています。それ以上に大きいと、VBAを組み合わせた、ワークシートのデータベース関数になるだろうと思っています。 Excelでは、純粋にVBAだけというのはなかなか出来ないものなのです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。 >なにぶん初心者なので・・ >種別を作って、関数計算するのでなく >vbで出来ればと思っています。 悪気ではありませんが、こちらも、お遊びになってしまいます。初心者の方が、VBA上で可能なのかというと、はなはだ疑問です。Dictionary オブジェクトを使うのは、なんとも知ったかぶりですっきりしないし、以下の配列変数のリストを用いるのも、可読性が落ちてすっきりしません。 それと、私が、なぜ、StrComp を使っているとか、一から説明する気にはならないのです。 以下のマクロの注意事項に、「実務上はシートから作る」ということになっていますが、Excelであろうがなかろうが、データベーステーブルが必要なのです。それを配列で代用しています。そうすると、Excelではワークシートが最適ですから、このレベルでは、VBAを使う必要がないのです。 VBA の処理 '------------------------------------------- 'リストアップする、カンマ(,)区切り。(実務上はシートから作ること) Private Const FRUIT As String = "みかん,りんご,バナナ,ぶどう" Private Const VEGET As String = "なす,キャベツ,いも,ジャガイモ" Sub MacroTest1()   Dim i As Long   Dim rng As Range   Dim cntFR As Long   Dim cntVEG As Long   Dim LastRow As Long      Dim arFR As Variant   Dim arVEG As Variant   arFR = Split(FRUIT, ",")   arVEG = Split(VEGET, ",")      Application.ScreenUpdating = False   With ActiveSheet     '品名範囲     Set rng = .Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp))     LastRow = rng.Rows.Count     For i = 1 To LastRow       If ItemMatch(rng.Cells(i, 1).Value, arFR) Then         cntFR = cntFR + rng.Cells(i, 2).Value       End If       If ItemMatch(rng.Cells(i, 1).Value, arVEG) Then         cntVEG = cntVEG + rng.Cells(i, 2).Value       End If     Next i     With rng       .Cells(LastRow + 3, 1).Value = "果物"       .Cells(LastRow + 3, 2).Value = cntFR       .Cells(LastRow + 4, 1).Value = "野菜"       .Cells(LastRow + 4, 2).Value = cntVEG     End With   End With   Application.ScreenUpdating = True End Sub Function ItemMatch(Ser As Variant, ItemLists As Variant) As Boolean Dim ret As Variant Dim v As Variant  For Each v In ItemLists   If StrComp(Ser, v, 1) = 0 Then 'TextCompare      ItemMatch = True     Exit For   End If  Next v End Function '------------------------------------------- 関数処理    E   F 1  果物  野菜 2  みかん なす 3  リンゴ いも 果物: =SUMPRODUCT(ISNUMBER(MATCH($A$2:$A$5,$E$2:$E$3,0))*$B$2:$B$5) 野菜: =SUMPRODUCT(ISNUMBER(MATCH($A$2:$A$5,$F$2:$F$3,0))*$B$2:$B$5)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

>エクセルのVBについて 「エクセルVBA」というのがふつう。 ーー こんなことを聞いているようでは、プログラムを組む前の段階だ。 なぜかというと、果物と野菜はシート1において、どのようにして(何を根拠に)判断するのか。 プログラムでは、人間が見たら・読んだら判る、ということを絶対持ち込んだら・考えたらいけない。 それを分類するデータが要る. コンピュタープログラムでは、データになっていること以外は処理で使えない。特に属性という部分を決定するのは、最終的に人間の思考による分類やその結果の分類コードだ。 ーー エクセルなら、関数でVLOOKUPを使う りんご 1 ミカン 1 なす  2 イも  2 のようなデータを作って、D列に Vlookup(A1,$G$1:$H$99,2,FALSE) と入れて式を複写し、分類コードを作り そのD列に基づいて集計なりをする。 集計も (1)データー集計の操作をVBAで行う (2)アルゴリズムを考えて集計する それにも   A.ソート法   B。棚へ加算法 などある。 (3)VBAでエクセルの関数を使う(SUMIF) http://oshiete1.goo.ne.jp/qa1243574.html など

回答No.3

VBAは普段使わないので 遊びで挑戦してみました。 Sub けいさん() Const 果物の種類 As Byte = 2 Const 野菜の種類 As Byte = 2 Dim 果物(果物の種類 - 1) As String Dim 野菜(野菜の種類 - 1) As String Dim n As Integer Dim 数量 As Long Dim i As Long 果物(0) = "みかん" 果物(1) = "リンゴ" 野菜(0) = "なす" 野菜(1) = "いも" 数量 = 0 For i = 2 To 5 For n = 0 To 果物の種類 - 1 If Cells(i, 1) = 果物(n) Then 数量 = 数量 + Cells(i, 2).Value Next n Next i Cells(11, 2) = 数量 数量 = 0 For i = 2 To 5 For n = 0 To 野菜の種類 - 1 If Cells(i, 1) = 野菜(n) Then 数量 = 数量 + Cells(i, 2).Value Next n Next i Cells(12, 2) = 数量 End Sub 種別と物の対応表がないので作るのに苦労しました もっと、スマートな方法はありそうですが(^^;

  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.2

だから#1さん の行っているように種別が無ければVBだろうがC#だろうが計算できません。 コンピュータは何が野菜で何が果物か知りませんから。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

 商品 数量 種別 みかん  1 果物 りんご  2 果物 なす   3 野菜 いも   4 野菜 として”種別”毎にSUMIF関数で求められるでしょう。 逆に”種別”がなければ、何がどのまとまりなのかわからない気がします。

tajimitoki
質問者

補足

回答ありがとうございます。 種別を作って、関数計算するのでなく vbで出来ればと思っています。

関連するQ&A