• ベストアンサー

Excel97で集計

Excel97を使っています。    D列             K列  L列 2 ○○商事 鈴木太郎   100  150 3 ○○商事 田中一郎   250  50 4 ▲▲株式会社       150  100 5 ○○商事 小林花子   200  50 6 ▲▲株式会社       50   200 7 (株)○○商事        100  150 8 △△テクノロジー(株)   300  10 という表があります。 D列を丸めて、K列とL列の合計を出したいのですが、 どのようにしたらいいでしょうか? D列を丸める際に、 例えば、2、3、5、7行目は丸めて、 D列に「○○商事 計」 K列に、650 K列に、400 と表示したいのです。 事前に並べ替えをしていても、上のように離れていたりしています。 また、実は上の内容をマクロでやりたいのですが、 そちらも解る方がいらっしゃれば教えて頂きたいです。 宜しくお願いします!

質問者が選んだベストアンサー

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.2

例に掲げた内容を条件とすれば、次のようなコードで集計出来るかと思います。 確認の意味で書きますが、先頭に"(株)"が付いているものと付かない名前を同一とし、 スペース(半角&全角)の手前までを比較しています。 「計」に掲げる会社名は、比較部分の名称です。 一応、何回集計してもいいようにしています。 これで如何でしょうか。 Sub Syuukei() Dim Rng As Range Dim RngS As Range Dim R As Range Dim S As Range Dim KName As String For Each Rng In Range("D2", Range("D65536").End(xlUp))   If Right(Rng.Value, 2) = " 計" Then ' 既存集計値を消去     Rng.ClearContents     Rng.Offset(0, 7).Resize(1, 2).ClearContents   End If Next Rng Set Rng = Range("D2", Range("D65536").End(xlUp)) '会社名データ範囲 Set RngS = Rng.Offset(Rng.Rows.Count) ' 会社名集計記入エリア For Each R In Rng   KName = R.Value   If InStr(R.Value, "(株)") = 1 Then KName = Mid(KName, 4)   'ここに先頭に"(有)"等の付く比較時に除くものがあれば上記同様に記述します。   KName = Left(KName, Len(KName) - InStr(KName, " "))   KName = Left(KName, Len(KName) - InStr(KName, " "))   Set S = RngS.Find(KName & " 計", lookat:=xlWhole)   If S Is Nothing Then     With Range("D65536").End(xlUp).Offset(1)       .Value = KName & " 計"       .Offset(, 7).Value = .Offset(, 7).Value + R.Offset(, 7).Value       .Offset(, 8).Value = .Offset(, 8).Value + R.Offset(, 8).Value     End With   Else     S.Offset(, 7).Value = S.Offset(, 7).Value + R.Offset(, 7).Value     S.Offset(, 8).Value = S.Offset(, 8).Value + R.Offset(, 8).Value   End If Next R Set Rng = Nothing Set RngS = Nothing End Sub

tamisara
質問者

お礼

回答ありがとうございます! 何回でも使えるように配慮して頂いて 本当に嬉しいです! 残念ながら、まだ試せないでいますが、 本当にありがとうございました。

その他の回答 (1)

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

コンピュタは文字を頼りに処理をするのですよ。 特にエクセルはセルの文字列を1塊として考えます。 2,3、5、7を同一と判別できるのは、人間だからです。 初めから、会社と個人名を列を分けなかったのが設計の失敗です。 (1)会社名と個人名を別列に分けることを考えましょう。 多少は手作業補正が入るにしても。分けておけば結合は 簡単です。=A1&" "B1のように。 (2)それと前株はソートの邪魔になります。一旦前株を空白に置換える列を作っては。小生も数10年前から経験しましたが今もって良案なし。 会社と個人の分離、同一会社の表現の統一ができれば あとはSUMIFやDSUM関数などで出来るでしょう。 ●上記(1)(2)の処理にVBAは使えます。 しかし全体の処理に付いては、ここで書くほど簡単でないと思います。内容の状況に応じてコーディングしないといけない点が多々ありそうだからです。 ●(1)(2)が済むと、ソートしてコントロールブレイクを利用して合計を出すと言う古典的方法をVBAで使えます。ロジックは簡単で基本情報処理技術者試験にでるレベルです。

tamisara
質問者

お礼

回答ありがとうございます。 >コンピュタは文字を頼りに処理をするのですよ。 はい。存じております。 やっぱりそうですよねー。 ですが、何しろ、上司の指示なので、 何とか答えられたら、と思い、質問してみたんです(汗) 元のデータは、別の部署が社内のシステムダウンロードしたものを頂戴したらしいので どうする事も出来ない様子。 システムへの入力はいろんな人が行っているので バラついてしまうのではないかと思いますが。 アドバイスを参考に試行錯誤してみます。 ありがとうございました。