Dim nn As Integer A       B        C ' 例えば         dicCor.Add sColor, nn Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照 返すにはどうしたらいいのでしょうか?    MsgBox c1 & "で" & c2 & "の数は " & ans  Dim I As Long 12 ききききき 800 商品名  商品番号  コード   Dim crng As Range End Sub Sub Test() A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。 と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。 Excelは経理に欠かせないツールですが、非常に奥が深く、すべての機能を覚えることは不可能です。そこで、経理業務にとって特に便利な機能を優先的に覚えていきましょう。, 中でも、もっとも経理に有用で、活躍の場が広くて深い関数は(有名なSUMを除くと)、「SUMIF(サムイフ)関数」です。, この関数を使いこなすと、複雑なデータの集計、整理、転送があっという間に自動化でき、さらに応用するとデータ収集、数値の突合せ、データ比較を驚くほど簡単に出来てしまいます。私はこのSUMIF関数を中心に業務を効率化し、前任者が2日かけていた業務を2時間に短縮したことがあります。, そこで本稿では、便利なSUMIF関数の基礎と機能を紹介します。SUMIF関数を使ったことのない人はもちろん、すでに使っている人も「こんな機能があったのか!」と驚かれると思います。, SUMIF関数は、リスト(表)の中から検索条件に合致する行や列の数値を合計するという関数です。以下で具体的な使用例を見てみましょう。, 上図左表の売上実績表から、右表の売上集計表の青いセルに、得意先別の売上高を集計して入力するにはどうすればいいでしょうか。, D列の該当セルを目で確認しながら「足し算」や「SUM関数」で集計するのは、手間もミスのリスクもかかる最悪の方法です。売上実績表を得意先名で並べ替えてから「集計」機能を使う方法はいくらかスマートですが、毎月同じ作業をするのは大変ですよね。, そこで、今回の主役であるSUMIF関数を使用します。G3セルに以下の数式を打ち込みます。, すると、G3セルはC列(得意先)から「東京商会」に合致する行を探し出し、同じ行のD列(税抜金額)を合計してくれます。, なお、上記はわかりやすさのため検索条件を文字列にしましたが、セル指定にすることもできます。つまり1-1の例の場合、, と表記することも可能です。(「C3からC13セルのうち、内容がF3セルと合致する行を検索し、同行のD列を合計する」という数式になります), 検索条件をセル指定にしておくことで、セルをコピーするだけで他の得意先も簡単に計算できます。, フィルハンドル(選択したセルの右下にある黒い四角)を押して下にドラッグすると、セルの内容を下のセルにコピーできます。また、フィルハンドルをダブルクリックすると、一番下まで一気にコピーできます。, SUMIFは数値を集計する場合だけでなく、単純にリストから1つの数値を取り出す際に大活躍します。, リスト検索をするときに何でも「VLOOKUP」を使う人がいますが、数値検索ではSUMIFのほうが遥かに便利です。その理由は以下のとおりです。, VLOOKUPは検索範囲が合計範囲よりも左側の列になければなりませんが、SUMIFはどこにあっても構いません。, VLOOKUPでは条件一致がない場合、近くのセルを参照するか、エラー値を返します。SUMIFであればゼロとして集計されるため、余計なエラーが発生しません。, VLOOKUPは合計範囲をリストの左から何列目という形で指定するため、間に列を追加すると式が壊れてしまいます。SUMIFの場合は間に列を追加しても式は自動修正されます。, 大事なことなので何度も言いますが、SUMIF関数は経理高速化に欠かせない超便利関数です。その機能を最大限発揮するために、以下の機能があることも覚えておきましょう。, 数式入力の手間が大幅に削減されるだけでなく、毎月行数が変化する膨大なデータも、貼り付けるだけで自動で漏れなく集計してくれます。また、ワークシートのどこかの行にある数字を拾う際にもとても便利です。, SUMIF関数はVLOOKUP関数のように縦書きのリストしか集計できないわけではありません。行と列が逆転した横書きの表でも集計してくれます。, システムから出力されるデータは、人間の目からみて綺麗な表になっていないことが多々あります。そんなとき、いちいち綺麗な表に書き換えてから使うのは非常に手間です。, システムから出力されるデータは、行ごとに情報がまとまっているため、SUMIFを使って特定の行を探し、数字を拾ってくることも可能です。, こうすることでExcelでは、「検索範囲内(C2:E5)の左上から縦2、横2の場所に検索条件(8月)に合致するセルがある」と認識し、「合計範囲(F2:H5)の左上から縦2、横2の場所にある数値を合計」してくれます。, 文字列の一部だけをヒントに、「〇〇という文字が含まれている」という検索条件を設定することも可能です。, 上記の場合、東京商会の本社と埼玉支社で分かれてしまっています。この場合に東京商会のトータルを合計するには、文字列のあいまいにしたい部分を「*」(アスタリスク/掛け算に使う演算子)で代用します。, この場合のアスタリスクは「ワイルドカード」と呼ばれ、「*東京商会*」と入力すると「文字列のどこかに”東京商会”が含まれるセル」を検索してくれます。, SUMIF関数での検索条件では、「5以上である」や「5以外」などを選択することができます。たとえば、, なお、「>=」というのは「以上(≧)」を表す「比較演算子」と呼ばれるもので、他には以下のものがあります。, なお、「5以上8以下」のように範囲検索したい場合は、後述するSUMIFの上位版である「SUMIFS関数」を使います。, SUMIF関数で指定できる検索条件は1つだけです。経理業務において多くの場合はそれで十分ですが、ときどき「複数の条件を満たした場合」で集計したいときもあります。そんなときに役に立つのが、SUMIFの上位版である「SUMIFS(サムイフス)関数」です。, 非常に便利なSUMIF関数ですが、実は少しだけ弱点があります。弱点をきちんと把握しておくことで、間違いのリスクを減らすことが可能になります。, リストから数値を取り出すときは、VLOOKUPよりもSUMIFのほうが遥かに便利です。しかし、SUMIFは数値しか扱えません。文字列を取り出すときは、少々使い勝手が悪くてもVLOOKUPを使いましょう。, SUMIFは条件範囲内に条件に合致するセルが複数ある場合、そのすべてを集計してくれます。そのため、リストの中に誤ったデータが混入されていると、それまで集計してしまうことになります。, 特に注意したいのが、月次決算において前月のExcelシートをコピーして使う場合です。データ量が前月よりも少ないと、データの貼付け領域に当月のデータを上書きした際、下の方に前月のデータが残ってしまうことがあります。, SUMIF関数はこのような予期しないデータまで集計してしまうため、合計値が元データと一致しているか確認するなどして、ミスの発生・見落としを防いでいきましょう。, 年間の全売上データなど、膨大なデータを集計する際は時間がかかります。もし相手先×月別の一覧表など作成しようとすると、再計算でパソコンが止まってしまいます。, 膨大なデータを扱う場合は「ピボットテーブル」という機能を使いましょう。ピボットテーブルは反復的に集計する場合は不向きで、集計結果も定型的なものになるため、正直SUMIFに慣れてしまうとイマイチ使い勝手が悪いように感じますが、機械に考えさせる時間は短いほうがいいでしょう。, 主に集計表を作成する際の注意として、検索条件の網羅性に注意しましょう。たとえば得意先別の売上集計表を毎月作っていると、新しい得意先が追加されたときは、必ず検索条件も追加しなければなりません。, ▶経理高速化とミス防止を同時達成するExcelの【ポカヨケ】設置法      MsgBox c1 & "で" & c2 & "の数は " & ans   Dim dicCor As Dictionary なし     黄色      100 VBAだと、どうもいいアイデアが浮かびません。よろしくお願いいたします。, 300行程度だとどれでもそんなに大きい差(処理時間)はありませんでした。     sName = r.Value この表で、それぞれ同じ名称の個数と合計金額を求めたいのです。 Sub Sample() '============================================================ 検索する = cells(i,2).Value SUMIFSにこだわりはないので別の計算方法でも構いません。ただし在庫がないときは0と表示されないといけません。   ans = 0   c1 = "野菜": c2 = "秋物" Excel(エクセル) 6. 12 ききききき 800 Sub 集計()         ' 色情報が未登録なら 新規登録 エクセルVBA SUMIFSの高速化 . For i = 2 To 65535   Dim c1 As String 9 おおおおお 10000 sumifs関数は、以下のとおり合計範囲の後ろに条件を追加していきます。 たとえば2-5で触れた「5以上8以下を集計する」場合は、以下のように入力します。 =sumifs(c:c, b:b,”>=5”, b:b,”<=8”) 4.sumif関数 … 2 あああああ 10000 モータ  U-1325-L   ・となると次はOPEN,INPUTですか? A B C D E       End If  Set xlBook = Workbooks....続きを読む, EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。 Dim readBook As Workbook ' 相手ブック   ' データの集計 Next T 5 いいいいい 9500 ここでDMNの値を四捨五入したいです。   Next このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。  Dim xlBook   I = I + 1 Set readBook = Nothing, 私がやる方法です。 思っております。よろしくお願い致します。 の方ですかね。, EXCEL2003 VBAにてマクロを作成しているのですが、作成日程が迫っているにも関わらず、       Set dicCor = New Dictionary 2 あああああ 10000 複数の列にVBAのプログラムで合計の値を出したいのです。 Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd    A列  B列 ・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。   Dim sName, sColor, obj 添付ファイル(上)のような表でAL列からBA列まで3行目から約10000行目(毎回変わります)までにSUMIFSを使いそれぞれの集計をしています。 セルE21のように、円の場合は「MUFJ」「ゆうちょ」ですので、MUFJとゆうちょのSUMIFS関数合計値を足しています。 ZPS = InputBox(">>> ステップを入力してください<<<") シートを変えずに他のシートから値を取得する方法はないのでしょうか。 writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む ' 例えば Dim writeSheet As Worksheet ' 自分自身の書き出し先シート ThisWorkbook.Name と、結果を返したいと考えています。 All rights reserved. MsgBox (" >>> 補間誤差自動計算 <<< ") Sub 例1()  しかし、 その前提で書きましたが。 というデータがあるとして、A列が「野菜」、B列が「秋物」に合致する       ' 未登録なら 色、値段を登録   Dim r As Range   Dim c2 As String エクセルvba初心者です。ご教授いただけると幸いです。ネットなどを見ながらvbaにチャレンジしています。仕事で在庫の集計表を作っています。添付ファイル(上)のような表でal列からba列まで3行目から約10000行目(毎回変わります)まで 10 おおおおお 14000   シートBの値取得   Dim ans As Long ThisWorkbook.Name For T = 38 To 53   For Each crng In Range("a1", Cells(Rows.Count, "a").End(xlUp)) End Sub    MsgBox c1...続きを読む, ※各種外部サービスのアカウントをお持ちの方はこちらから簡単に登録できます。 ※イメージ なし     黄色      200   Dim r As Range      End With Sub 例1()       Debug.Print sName, sColor, nn 宜しくお願いします。, EXCEL2003 VBAにてマクロを作成しているのですが、作成日程が迫っているにも関わらず、       ' 色情報を更新   Dim c2 As String        : Dim ZPOS As Double 図は、明細と合計欄です。 A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。 ですね。 If Sheets(1).Range("A2")(i) = Sheets(1).Range("A2")(i - 1) Then やりたいことは 上記コードで計算はできたのですが約13分かかってしましました。       dicName.Add sName, dicCor 他のフォルダーにあるEXCELの項目の内容を取り込みたいです。       ' セルに転記するなら Rangeなどに置き換えましょう 3 あああああ 12000 デバッグはしてません。またオーバーフロー等あると思うのでそのあたりはご自分で。 数字を合計するのはA列とB列がともに一致した時のみです。     Else  ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は   Dim sName, sColor, obj   Worksheets("シートA").Activate   Dim c2 As String     ' 色を取得 添付ファイル(下)zaikoのシートは元データが入っています。 Dim readBook As Workbook ' 相手ブック メロン    緑       10 ピンクのセルが円、それ以外はドルです。 2行:果物  秋物 11 かかかかか 13000 自動計算にならないと思うので・・・, 例えば、Sheet2のA6セルに質問の数式を入力するのであれば次のようにします。 4 あああああ 9000   ' 出来上がったデータを表示  Dim I As Long  I = 2     End If    With .Columns(3) 配列数式を使うのと、sumifsを使うのでは、どちらのほうが処理速度が遅いですか? Excel google スプレッドシートで以下の画像のようにarrayformulaをcountifsに適用して 各人毎の出勤、遅刻、欠勤回数を割り出そうとしていますが arrayformulaの縛りのためか、その下に数列が続きません。 動)|VBA入門, Application.Calculation = xlCalculationManual. Dim ZPS As Double すぐ行き詰ってしまいます。どうかご指導お願い致します。    ans = Evaluate("sumproduct((" & .Columns(1).Address & "=""" & c1 & _ お客様の許可なしに外部サービスに投稿することはございませんのでご安心ください。, http://detail.chiebukuro.yahoo.co.jp/qa/question …, エクセルマクロVBA初心者です。 いつも参考にさせていただいております。 エクセルマクロVBAにて, エクセルVBAにて、重複データ処理の高速化を実施したいのですが、いい方法はありますでしょうか?  MsgBox ("完了") End Sub, こんにちは。 りんご    緑       100       n = dicCor(sColor)  Loop   With Range("a1", Cells(Rows.Count, "a").End(xlUp)).Resize(, 2) テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。 また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。 If Sheets(1).Range("A2")(i) = "" Then Exit For      If .Value = c1 And .Offset(0, 1).Value = c2 Then ans = ans + 1 これを、1行にまとめたいのですが、適切な関数はないでしょうか?    With crng Windows("部品表.xls").Activate   Dim c1 As String   Dim dicName As New Dictionary 再計算が終わらない… そんな経験をした人は多いと思います、原因はさまざまですが、まずは数式を見直してみましょう。単純な四則演算が遅いという事はありません、それはもうpcの問題です。時間のかかる計算としては、大量データの集計計算を多数使っている場合です。 Next Dim i, MyTotal As Double, MyCount As Double ・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。 りんご    緑       500   Dim c1 As String MyTotal = MyTotal + Sheets(1).Ran...続きを読む, メインプログラム(EXCEL VBA)より、 商品名  商品番号  コード       Set dicCor = dicName(sName)         nn = dicCor(sColor) + nn    End With 7 ううううう 15000 また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。   Dim dicName As New Dictionary Sheet1.Cells(23, 6).Value = DMN A       B        C             """)*(" & .Columns(2).Address & "=""" & c2 & """))") Set readSheet = Nothing 関数だとデータベース関数を使えば何とかできそうな感じなのですが Sub 別ブックから貼り付ける()    End With  Application.ScreenUpdating = True MyCount = 1 readBook.Close False ' 相手ブックを閉じる     sColor = r.Offset(, 1).Value   MsgBox c1 & "で" & c2 & "の数は " & ans なし     黄色      100