
以前ここで
A1に1,10,3という文字列があるときB1でそれを集計して14としたいと質問したところ下記の回答をいただき大変ありがたく使わせていただいているのですがA1が空白だと#VALUE!とエラーが出てしまうのですがでないようにできないでしょうか
エクセルは2016です
よろしくお願いします
B1 =SumComma(A1)
【VBA】
Function SumComma(ByVal カンマデータ As Variant) As Variant
SumComma = Evaluate(Replace(カンマデータ, ",", "+"))
End Function
No.6ベストアンサー
- 回答日時:
既に、VBAによるユーザ定義関数を変更せずに対応する方法が複数回答されています。
現実的な対応だと思います。VBA自体を変更するのであれば、No.5さんのお考えをユーザ定義関数に反映させて、A1が「空白」のときは#VALUE!エラーではなく、0が返るということでよいのなら、
【VBA】
Function SumComma(ByVal カンマデータ As Variant) As Variant
SumComma = Evaluate(Replace(カンマデータ & ",0", ",", "+"))
End Function
というコードに変更すればよいのではないかと思います。
No.5
- 回答日時:
B1 =SumComma(A1)
↓
B1 =SumComma("0"&A1&",0")
とか。
値が無いのに Replace で演算させようとしてるからエラーになるのだから、
元の値に対して影響のない範囲で加工した値を与えてやればいいわけです。
A1に "1,10,3" という文字列ならば、
B1は "01,10,3,0" に対してマクロを実行しようとする。
A1が 空白 ならば、
B1は "0,0" に対してマクロを実行しようとする。
これなら、マクロはエラーにならない。
(´・ω・`) 難しく考えなくても良いと思うんだ。
No.4
- 回答日時:
VBAを下記のように修正する。
一応、うまく行くことを確認したのですが、環境が違う(Excel2019)ので、自信がありません。考え方は、
・三項演算子を使う
・Trimで空白を除いて、空欄でない場合の処理(最初のiif)
・","の後ろに数値がない場合もエラーとなるので、InStrRev(後ろから","を点検、len()と一致する(つまり、最後が","の場合) 二つ目のiifで、文字列に強制的に"0"を追加した上で、オリジナルの処理をする
・蛇足ながら、","で始まるケースはエラーになりませんので、スルー
Function SumComma(ByVal カンマデータ As Variant) As Variant
SumComma = IIf(Trim(カンマデータ) <> "", IIf(InStrRev(カンマデータ, ",") = Len(カンマデータ), Evaluate(Replace(カンマデータ & "0", ",", "+")), Evaluate(Replace(カンマデータ, ",", "+"))), "")
End Function
たまたま、三項演算子なるものを使ってしまったのですが、素直にVBAらしく組んだ方が良いと思います。
Function SumComma(ByVal カンマデータ As Variant) As Variant
If Trim(カンマデータ) <> "" Then
If InStrRev(カンマデータ, ",") = Len(カンマデータ) Then
SumComma = Evaluate(Replace(カンマデータ & "0", ",", "+"))
Else
SumComma = Evaluate(Replace(カンマデータ, ",", "+"))
End If
Else
SumComma = ""
End If
End Function
No.2
- 回答日時:
Sub 集計マクロ()
Dim セルA As Range
Dim 値 As Integer
Dim 配列() As String
Dim i As Integer
' A1の値をセルAに設定
Set セルA = Range("A1")
' A1が空白でない場合の処理
If セルA.Value <> "" Then
' カンマ区切りの文字列を配列に分割
配列 = Split(セルA.Value, ",")
' 配列の各要素を整数に変換して集計
値 = 0
For i = LBound(配列) To UBound(配列)
値 = 値 + CInt(Trim(配列(i)))
Next i
' 集計結果をB1に表示
Range("B1").Value = 値
Else
' A1が空白の場合、B1も空白にする
Range("B1").Value = ""
End If
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel VBAでフォルダ内の全テキストファイルの任意データを取得について 7 2021/12/18 16:00
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) 超難 日付に対するクロス集計 7 2021/12/06 20:56
- Excel(エクセル) 空白行も含めてソートしたい 3 2022/02/01 23:13
- Visual Basic(VBA) クリップボードに貼付している文字列が、マクロで別ブックへ転記すると、消えてしまう 1 2023/10/15 13:36
- Excel(エクセル) Rangeメソッドは失敗しました。globalオブジェクトについて 6 2021/11/21 21:54
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- Visual Basic(VBA) xmlドキュメントから別拡張子で保存したい 4 2023/09/12 11:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
表にフィルターをかけ、絞った...
-
エクセルで、絶対値の平均を算...
-
array関数で格納した配列の型を...
-
[エクセル]連続する指定範囲か...
-
Excel オートフィルタのリスト...
-
Excelのセルの色指定をVBAから...
-
【VBA】ユーザーフォーム リス...
-
VBAで指定期間の範囲を抽出し、...
-
.NET - 配列変数を省略可能の引...
-
VBA 配列に格納した値の平均の...
-
VBAでの100万行以上のデータの...
-
読み込みで一行おきに配列に格納
-
ExcelのINDEXとMATCH関数でスピ...
-
For Nextマクロの高速化につい...
-
配列がとびとびである場合の書き方
-
C言語で、変数名を引数として渡...
-
複数のレコードを取得する方法
-
iniファイルのキーと値を取得す...
-
DataSetから、DataTableを取得...
-
Sessionに格納した二次元配列を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで、絶対値の平均を算...
-
[エクセル]連続する指定範囲か...
-
表にフィルターをかけ、絞った...
-
ExcelのINDEXとMATCH関数でスピ...
-
Excelのセルの色指定をVBAから...
-
Excel オートフィルタのリスト...
-
DataSetから、DataTableを取得...
-
array関数で格納した配列の型を...
-
読み込みで一行おきに配列に格納
-
.NET - 配列変数を省略可能の引...
-
【VBA】ユーザーフォーム リス...
-
配列がとびとびである場合の書き方
-
SUMPRODUCT関数を用いた最小値
-
iniファイルのキーと値を取得す...
-
VBAでの100万行以上のデータの...
-
エクセルでエラーを無視して一...
-
配列のSession格納、及び取得方...
-
VBA 配列に格納した値の平均の...
-
VB6.0 ファイルの一括読込み
-
Datatableへの代入
おすすめ情報