- 締切済み
エクセルのVBについて質問です。
<例> エクセルのシート(1)の各セルに以下の様にある場合。 数量 形状 みかん 1 個 リンゴ 2 個 なす 3 個 いも 4 個 シート(2)に以下の様にまとめるにはどの様なvbを組めばよいでしょうか 数量 形状 果物 3 個 野菜 7 個 *なにぶん初心者なので・・。 尚、vbで組みたいので宜しくお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
#5 の補足させていただきます。 読み直してみたら、あまり、品の良い書き方ではありませんでしたので、少し補足させていただきます。実務上で、#5 のようなコードを書くことは、あまりないだろうなって思って書いたまでです。あえて、VBAを所望される理由は、それは規模が大きいのではないか、と思うからです。 実務上の問題を交えて質問の補足をしてくださると、もう少し違ったものになるだろうと思います。#5で、関数処理というサンプルを示しましたが、だいたい、2~3000行程度ぐらいまでは、問題なく関数処理できるだろうと思います。それ以上のものについて、#5のVBAのコードのようなスタイルが良いのかもしれませんが、あまり大きなものには向いていないのではないか、と思っています。VBAは、比較的中規模(~3万行程度)な処理に向いています。それ以上に大きいと、VBAを組み合わせた、ワークシートのデータベース関数になるだろうと思っています。 Excelでは、純粋にVBAだけというのはなかなか出来ないものなのです。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >なにぶん初心者なので・・ >種別を作って、関数計算するのでなく >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)
>エクセルの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 など
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
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)
だから#1さん の行っているように種別が無ければVBだろうがC#だろうが計算できません。 コンピュータは何が野菜で何が果物か知りませんから。
- n-jun
- ベストアンサー率33% (959/2873)
商品 数量 種別 みかん 1 果物 りんご 2 果物 なす 3 野菜 いも 4 野菜 として”種別”毎にSUMIF関数で求められるでしょう。 逆に”種別”がなければ、何がどのまとまりなのかわからない気がします。
補足
回答ありがとうございます。 種別を作って、関数計算するのでなく vbで出来ればと思っています。