中国サンネット 駐日本釜山貿易投資事務所 御所車


ソフトウェアの部屋 一覧に戻る
投稿番号:100265  投稿日:2003年08月05日 12時28分21秒 パスワード
お名前:さぶ

Excelでセルの中にカンマ区切りのデータ

キーワード:Excel カンマ セル
ソフトの種類 :ビジネス

Excelで、セルの中にカンマ区切りの数字データ( 3,5,6 とか )が入っている
ものを集計したいのですが、関数でうまく処理する方法をご存知の方が
いらっしゃいましたら教えていただきたいのですが。

[1]KnightOnTheDogさんからのコメント(2003年08月06日 02時42分33秒 )
本人によりコメントは削除されました。 2003年08月06日 02時46分30秒

[2]KnightOnTheDogさんからのコメント(2003年08月06日 02時47分38秒 )
本人によりコメントは削除されました。 2003年08月06日 02時50分00秒

[3]KnightOnTheDogさんからのコメント(2003年08月06日 02時50分52秒 )
パスワード
カンマつきのセルをどのように処理したいのか不明ですけど、
加算したいのでしょうか?
仮に加算するとした場合のVBA関数の例を示します。
以下をVBEで標準モジュールに貼り付けて下さい。

その後は標準関数の様につかえます。
例えば、ワークシートのA1セルに 3,5,7,99 という内容が記されている場合に、
A2セルに = SumCommaSeparatedValue(A1)記入すれば(あるいは ツールバーの
fx で、ユーザー関数からSumCommaSeparatedValueを選べば)、A2には、
加算結果の114が表示されます。

なお扱う数値が大きい場合は、以下のコードの "Single" 4箇所を "Double" に
書き換えるか、いっそ "Variant" に変更してください。

加算でなく、乗算ならば、
ans = ans + t
の部分2箇所を
ans = ans * t
に変更してください。
その場合は関数名も、Sum〜でなく、Multiply〜としたほうが良いでしょう。

Function SumCommaSeparatedValue(ByVal c As Range) as Single
  Dim ans As Single
  Dim vstr As String
  Dim i As Integer
  Dim p As Integer
  Dim t As Single

  ans = 0
  vstr = c.Text
  Do
    vstr = Trim(vstr)
    p = InStr(vstr, ",")
    If p > 0 Then
      t = Val(Left(vstr, p - 1))
      ans = ans + t
      vstr = Trim(Mid(vstr, p + 1))
    Else
      t = Val(Trim(vstr))
      ans = ans + t
      vstr = ""
    End If
  Loop Until Len(vstr) = 0
  SumCommaSeparatedValue = ans
End Function

[4]さぶさんからのコメント(2003年08月06日 10時06分31秒 )
パスワード
早速の返事ありがとうございます。

言葉が足りなくて申し訳ありませんでした。
加算ではなく個数の集計をしたいのです。

(値)
3,5,7

(求めたいもの)
3が一個
5が一個
7が一個

示していただいたVBは大変参考になります。

VBにはあまり明るくないのですが、「VBE」はエディタということ
ですよね?(文脈から・・・)

関数から直接VBが呼べるのですね。
カンマ区切りを分解して、目的の数値が含まれていれば1を返す
関数を作成すれば良さそうですね。
どうもありがとうございます。

余談なんですが、VBA側からエクセルの関数ってよべるんでしょうか?
(別スレッドにしろと怒られそうですが・・・)


[5]KnightOnTheDogさんからのコメント(2003年08月07日 03時06分18秒 )
本人によりコメントは削除されました。 2003年08月07日 03時07分06秒

[6]KnightOnTheDogさんからのコメント(2003年08月07日 03時08分48秒 )
本人によりコメントは削除されました。 2003年08月07日 03時09分39秒

[7]KnightOnTheDogさんからのコメント(2003年08月07日 03時10分10秒 )
パスワード
> VBにはあまり明るくないのですが、「VBE」はエディタということ
> ですよね?(文脈から・・・)

そうです。略して書いてしまいましたが、
 VBA = Visual Basic for Application
 VBE = Visual Basic Editor
です。

セルに記入されたそれぞれの数字の個数を数えたいならば、コンマを
避けながら、表れた数字を逐次足していけばよいだけです。

セルに記入される桁数が決まっているのならば、配列を用意してそこを
カウントアップする方法がいちばん簡単でしょうね。
0〜99なら 要素数が100個の1次元配列を宣言)

数値の桁範囲が広い代わりに、カンマで区切られた数がそれほど多くない
(例えばせいぜい10個)というような場合は、適当なサイズの2次元配列を
用意して、見つけた数字とその個数を記録しながら、次に見つけた数字が
配列に存在するかサーチしながらカウントアップする方法が良いでしょう。

以下は、桁範囲が決まっている場合(つまり前者)のサンプルです。
メッセージボックスで答えを表示するとともに、セルにも答えを返します。

Option Base 0

Function CountUpNumber(ByVal c As Range) As String
  Const MAXNUM = 99
  Dim NumCount(MAXNUM)
  Dim vstr As String
  Dim ans1 As String
  Dim ans2 As String
  Dim i As Integer
  Dim p As Integer
  Dim t As Single

  vstr = c.Text
  Do
    vstr = Trim(vstr)
    p = InStr(vstr, ",")
    If p > 0 Then
      t = Val(Trim(Left(vstr, p - 1)))
      NumCount(t) = NumCount(t) + 1
      vstr = Trim(Mid(vstr, p + 1))
    Else
      t = Val(Trim(vstr))
      NumCount(t) = NumCount(t) + 1
      vstr = ""
    End If
  Loop Until Len(vstr) = 0
  ans1 = ""
  ans2 = ""
  For i = 1 To MAXNUM
    If NumCount(i) > 0 Then
      ans1 = ans1 & i & " は " & NumCount(i) & " 個" & vbCrLf
      ans2 = ans2 & i & " は " & NumCount(i) & " 個 / "
    End If
  Next i
  MsgBox ans1
  CountUpNumber = ans2
End Function


VBAからエクセルの関数が使えるかという件ですが、一部使えないものも
あったような気がしますが、使える場合は、
Application.IsNumber や Application.Find といった具合に、
Application. をワークシート関数の前につけた形で呼びます。

尤も、ほとんどの関数は(パラメータの順序などは違う事も多々ありますが)
VBA側でも同等のものが揃っていますから、どうしてもワークシート側の
関数でなくてはいけないという場面だけに使用されるやり方ですが。
それに旧版では使えていたワークシート関数が新版で使えなくなる場合も
過去にあったので、VBAで同等の物がある場合はそちらを使うほうが良い
でしょう。

[8]KnightOnTheDogさんからのコメント(2003年08月07日 03時19分18秒 )
パスワード
上のサンプルで、0もカウントする場合の例だったので、
最後の方にある
  For i = 1 To MAXNUM
は、
  For i = 0 To MAXNUM
でなくてはいけませんね。

[9]aaaaaさんからのコメント(2003年08月07日 23時12分19秒 )
パスワード
>(値)
>3,5,7

この、セルに入力された値を加工してはだめなんですか?

ツール => 区切り位置で、区切り文字にカンマを指定すると、
上の例で言えば、3つのセルに分割されます。
セル単位にデータが分かれれば、COUNTIF関数を使って
個数をカウントできます。
集計する数字がたくさんあると、ちょっと大変かもしれませんが。

[10]さぶさんからのコメント(2003年08月08日 16時19分25秒 )
パスワード
KnightOnTheDogさん、aaaaaさん、どうもありがとうございます。

> この、セルに入力された値を加工してはだめなんですか?

本当は、Countifでできればラクだなー、と思っていたのですが、
カンマが障害でできなかった次第です。

カンマ区切りの値が、横方向に約20個ならんでいて、
それぞれを(縦方向に数千個)集計していくため、カンマ区切りの
データがうまくいかずに悩んでいました。

来週あたり、プログラムを組んでみようと考えています。



 【 ソフトウェアの部屋 一覧に戻る


株式会社ムーブ 株式会社大庭工務店 太陽光発電普及推進協会


この投稿に対するコメント
コメント:

HTMLタグは使えません。改行は反映されます。
http://xxx.xxx/xxx/xxx や xxx@xxx.xxx のように記述すると自動的にリンクがはられます。

お名前:(省略不可)
削除用パスワード:(省略不可8文字以内)
メールアドレス:(省略不可)
URLアドレス:
 ホームページをお持ちの方のみ、そのURLアドレスを記入してください。



チップス

Copyright(C) 2000 Tips. All Rights Reserved.◇  DB-BBS-system V1.20 by Rapha.