- ベストアンサー
エクセルVBAでDSUMを使った自動計算をする方法
- エクセルVBAでDSUMを使って自動計算を行いたい場合、以下の方法を試してみてください。
- まず、データが入っているシートと計算を行いたいシートを指定します。データが入っているシートは「データ」とし、計算を行いたいシートは「集計用」とします。
- 次に、集計用シートのE列のデータが入っている行数を求めるために、COUNT関数を使用します。COUNT関数の結果は「mycount」という変数に格納します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんばんわ。 回答に対する補足ありがとうございます。 >・If ... Thenですが、ここの質問内容を800字以内にしないとエラーになるので削りました。 ・ ・ >End If この内容でしたら、これで良いと思います。 ただ一つ、 Else MsgBox "部屋タイプを選択してください" End If 上のコードは、 Else MsgBox "部屋タイプを選択してください" Exit Sub End If とした方が良いです。 「Exit Sub」を追加していますが、これは、マクロの実行をここで中止します。 理由は、「Else」処理の場合、「タイプ」変数にデータを設定していないので、このままDsum関数のコードを実行するとエラーになります。 >DSUM関数の部分のソースを↓のとおり実行したらエラーになります。 惜しいですね。もう少し複雑な例をあげれば、emi445さんの書き換えるコードが正解になっていたような気がします。 ワークシート関数で複数シートのセルを指定する場合は、シート(名)とCells()をセットで指定する必要があります。 >Sheets("集計用").Range(Cells(1, 1), Cells(mycount, 5))) 上の部分を、 Range(Sheets("集計用").Cells(1, 1), Sheets("集計用").Cells(mycount, 5))) としなければなりません。 なお、下の指定でも良いです。 Sheets("集計用").Range("A1:E" & mycount)) これは、「mycount」が「100」の場合、 Sheets("集計用").Range("A1:E100")) と同じです。 この他に注意事項として、 Dsum関数のコードで、2つの変数「タイプ」・「mycount」を使用していますが、Dsum関数のコードを実行する前に、この変数の値を確定させる必要があります。 (そうしないと、Dsum関数のコード実行時にエラーになる) 以上をまとめて、下に修正したマクロを載せます。 '--------マクロコード--------始まり Sub test() Dim タイプ As Long, mycount As Long If Sheets("フォーム").Range("C30") = "1K~1LDK" Then タイプ = 3 ElseIf Sheets("フォーム").Range("C30") = "2K~2LDK" Then タイプ = 6 ElseIf Sheets("フォーム").Range("C30") = "3K~3LDK" Then タイプ = 9 ElseIf Sheets("フォーム").Range("C30") = "4K~4LDK" Then タイプ = 12 ElseIf Sheets("フォーム").Range("C30") = "その他" Then Sheets("集計用").Range("B1") = "タイプ5" Sheets("集計用").Range("B2") = 5 タイプ = 15 Else MsgBox "部屋タイプを選択してください" Exit Sub End If mycount = Application.WorksheetFunction.Count(Worksheets("集計用").Range("E2:E300")) Sheets("集計用").Cells(5, 7) = Application.WorksheetFunction.DSum( _ Sheets("データ").Range("A1:U1610"), Sheets("データ").Cells(1, タイプ), _ Sheets("集計用").Range("A1:E" & mycount)) Range("G10") = Sheets("集計用").Cells(5, 7) End Sub '--------マクロコード--------終わり また、わからない点や、うまくいかない部分がありましたら、私のわかる範囲でお答えします。 それから、Excelマクロを勉強されるなら、下のURLを参考にされると良いと思います。 「Excelでお仕事」 http://www.asahi-net.or.jp/~ef2o-inue/top01.html 「Smile!Excel」 http://www.happy2-island.com/excelsmile/index.html 「Excel VBA モーグ即効テクニック集」 http://www.moug.net/tech/exvba/index.htm 「K窓 Excel技Excel Tips」 http://homepage2.nifty.com/kmado/kvba.htm なお、私がExcelVBAを使いこなせる様になったのは、下の本を読んでからです。(おすすめです) かんたんプログラミング Excel2003 VBA 基礎編 かんたんプログラミングExcel2003 VBA 応用編 かんたんプログラミング Excel2003 VBA コントロール・関数編 かんたんプログラミング Excel2002VBA 演習編
その他の回答 (5)
- e10go
- ベストアンサー率38% (47/122)
No.4,No.5のe10goです。 No.5で一番下に紹介した本ですが、私が読んだ本は全てExcel2000の本でした。 紹介した本も、内容はほぼ同じです。 どうも、すみませんでした。
- e10go
- ベストアンサー率38% (47/122)
こんばんわ。 emi445さんは、Excelのシート上での関数の使い方は理解されていると思いますが、 質問の内容を拝見すると、マクロでの関数の使い方をご存じないように見受けられます。 私も、マクロで初めて関数を使う時に、質問者さんと同じようなコードを書きましたので^^; DSUM関数は、下のURLの例で、 http://homepage1.nifty.com/kenzo30/ex_kisotyu/ex_ks_tyukyuxb3_1.htm#データベース関数・書式と引数 Excel表では、計算式が =DSUM(A2:D11,D2,A14:C15) となりますが、マクロコードでは、 Range("E15") = Application.WorksheetFunction.DSum(Range("A2:D11"),Cells(2, 4), Range(Cells(14, 1), Cells(15, 3))) となります。 Excel表で使う関数をワークシート関数といい、マクロで関数を呼び出したり、 セルを指定する方法は、Excel表で使うやり方とは異なります。 前置きはそれぐらいにして(長い^^;)、具体的にコードを示そうと思いましたが、 質問の意味がよく判らないので、私なりに整理しました。 >"=DSUM(cells(データ!,1),1610,21),cells(データ!1,タイプ),cells(集計用!),cells(mycount,5))" DSUM関数の使い方は、DSUM(データベースの範囲,フィールド,Criteria)、です。 最も、emi445さんは、DSUM関数の使い方はご存知ですよね。 「データベースの範囲」は、「=DSUM(cells(データ!,1),1610,21),...)」とありますが、 「シート"データ"のセルA1~U1610」の事ですね。 「フィールド」は、「=DSUM(...,cells(データ!1,タイプ),...)」とあるので、 シート"データ"のセルA1~U1のどれかを「タイプ」で指定したいのでしょう。 「Criteria」は、「=DSUM(...,cells(集計用!),cells(mycount,5))」とありますが、 シート"集計用"の中のE列mycount行を指定するのですか? 取り合えずそういう事にしておきます。 これらをまとめると、下の元のコードは、 mycount = "=COUNT(集計用!E2:E300)" Sheets("集計用").Cells(5, 7).Value = Range("g10") = " =DSUM(cells(データ!,1),1610,21),cells(データ!1,タイプ),cells(集計用!),cells(mycount,5))" 下のコードになります。 mycount = Application.WorksheetFunction.Count(Worksheets("集計用").Range("E2:E300")) Sheets("集計用").Cells(5, 7) = Application.WorksheetFunction.DSum( _ Sheets("データ").Range("A1:U1610"), Sheets("データ").Cells(1, タイプ), _ Sheets("集計用").Cells(mycount, 5)) Range("G10") = Sheets("集計用").Cells(5, 7) なお、 Sheets("集計用").Cells(5, 7) は、 Sheets("集計用").Range("G5") でも良いです。 後、これは、補足要求ですが、 1. DSUM関数の「Criteria」は、E列mycount行で良いでしょうか? 私の解釈が間違っているような気がしますが。 2. 後半のコードで、 '部屋タイプの選択 If Sheets("フォーム").Range("c30") = "1K~1LDK" then タイプ = 3 ・ ・ End If とありますが、 シート"フォーム"のセルC30に「1K~1LDK」とあれば、「タイプ = 3」になるのでしょうか。 それとも、「1K」または「1LDK」でも「タイプ = 3」になるのでしょうか。 それによって、マクロコードが変ります。 最後に、 '部屋タイプの選択 If ... Then ・ ・ Else Sheets("フォーム").Range("c30") = "その他" Then タイプ = 15 End If の中で、 Sheets("フォーム").Range("c30") = "その他" Then の後ろの、「Then」は削除してください。 これがあると、エラーになります。 If ... Then ElseIf ... Then 以外で「Then」は使用できません。
補足
解説ありがとうございます。 マクロで関数を使用するのは初めてで使い方がわかりませんでした。 ・CriteriaはA1からE列mycount行です。 ・sheetsフォームC30が1K~1DLKだったらタイプ=3になります。(フォームにリストボックスを作っていて、1K~1DLKを選択するとセルC30に1K~1DLKが入ります。) ・If ... Thenですが、ここの質問内容を800字以内にしないとエラーになるので削りました。 ↓のソースが続きです。 ElseIf Sheets("フォーム").Range("c30") = "その他" Then Sheets("集計用").Range("b1") = "タイプ5" Sheets("集計用").Range("b2") = 5 タイプ = 15 Else MsgBox "部屋タイプを選択してください" End If DSUM関数の部分のソースを↓のとおり実行したらエラーになります。 よろしくお願いします。 Sheets("集計用").Cells(5, 7) = Application.WorksheetFunction.DSum( _ Sheets("データ").Range("A1:U1610"), Sheets("データ").Cells(1, タイプ), _ Sheets("集計用").Range(Cells(1, 1), Cells(mycount, 5)))
- papayuka
- ベストアンサー率45% (1388/3066)
imogasiさん > =が2つ左辺に出現しますが、ありえない。 ありえなくは無いですよ。 test1はTrue、test2はFalseが返ります。 Sub test1() Range("A2:A3").Value = "○" Range("A1").Value = Range("A2").Value = Range("A3").Value End Sub Sub test2() Range("A2").Value = "○" Range("A3").Value = "△" Range("A1").Value = Range("A2").Value = Range("A3").Value End Sub
- imogasi
- ベストアンサー率27% (4737/17069)
質問の意味をはっきりさせてください。 >DSUMを使って エクセル(ワークシート)関数のDSUMを使うのですか。 であれば Application.Worksheetfunction。Dsumとしないといけないはずですが。 >A1からE列まで(選択する項目によって何行目になるかわかりません。)の意味は?? 片一方はA1とセルを言ってながら、Eは列を言っているのは?? E1のミスタイプ?? >mycountでE列のデータが入ってる行を出してます。 この意味は??E列とはセルE1のこと。 >DSUMの式のタイプに1を入れたいのです Dsum関数の引数に「タイプ」という引数がないはず。Criteriaと言われる引数のこと?? Dsumなんて関数は、VBAでは使わないでIF分で判別すればすっきりするように思うが。 >mycount = "=COUNT(集計用!E2:E300)" は文字列をmycountに入れて、cells(集計用!),cells(mycount,5))" で使っているが無茶な記法では? コードから回答者に逆推測させ、添削させるより、現状のシートの状態の実例を上げて、やりたいことをはっきり書く方がためになると思います。 全体に記法がめちゃなような印象なんですが。 Sheets("集計用").Cells(5, 7).Value = Range("g10") = ・・ =が2つ左辺に出現しますが、ありえない。 DSUM(cells(データ!,1),1610,21),cells(データ!1,タイプ),cells(集計用!),cells(mycount,5))" セルにVBAでエクセルの関数式を書いたら、手作業で入力したのと同じになるという、誤解してませんか。 Sub test01() Cells(2, 3).Formula = "=SUM(A1:A3)" End Sub を参考に。
- papayuka
- ベストアンサー率45% (1388/3066)
mycount = "=COUNT(集計用!E2:E300)" は 文字列を mycount に代入しているだけです。 その次の行は Range("g10") の値が " =DSUM~" と等しいか否かをセルG5に代入しているだけです。 また式をセルに入れたいなら文字列で直接Cellsとしても意味がありません。 タイプと言う変数を使いたいなら、値をセットした後に使用しないと意味がありません。 mycount部分だけですがサンプルです。 Sub Test() mycount = "=COUNT(集計用!E2:E300)" MsgBox mycount mycount = WorksheetFunction.Count(Worksheets("集計用").Range("E2:E300")) MsgBox mycount End Sub
お礼
おかげで、思ったとおりに動作させることができました。 ありがとうございました。