プロが教えるわが家の防犯対策術!

あるセル①が
セル① =A-B+C-D
で定義されている時、セル①のプラスとマイナス要素を別のセル②、③に分割して
セル② =A+C
セル③ =B+D
と何かの関数等で分割することは可能でしょうか。

A 回答 (2件)

私も作ってみました。


スイッチで、0 は、#1さんと同じスタイルで、スイッチ 1 で、値のプラスマイナスで別けます。一般の関数では、無理だと思います。
このマクロは、任意の場所(ActiveCell)の数式の下に2行を使って表示します。

'//
Sub DevideFormula1()
 Dim RegEx As Object
 Dim Ms, m
 Dim fml As String
 Dim a, b
 Dim plus As String
 Dim minus As String
 'スイッチ
 Const SW As Long = 0 '0-文字で分ける,1-値で分ける
 Set RegEx = CreateObject("VBScript.RegExp")
 With RegEx
  .Global = True: .IgnoreCase = False: .MultiLine = True
  .Pattern = "([\*\/\-\+]?\w+\d+?)"
  'or directly: result_text =.Replace(enter_text, "$1")
 End With
 If ActiveCell.HasFormula = False Then
  MsgBox "数式がありません", vbExclamation
  Exit Sub
 End If
 fml = ActiveCell.Formula
 fml = Replace(fml, "=", "")
 Set Ms = RegEx.Execute(fml)
 For Each m In Ms
  a = m.SubMatches(0)
  b = Evaluate(a)
  If SW = 1 Then
   '値で分ける
   If b >= 0 Then
    plus = plus & a
   ElseIf b < 0 Then
    minus = minus & a
   End If
  Else
   '文字で分ける
   If Left(a, 1) = "-" Then
    minus = minus & a
   ElseIf Left(a, 1) = "+" Or Left(a, 1) Like "[A-Z]" Then
    plus = plus & a
   End If
  End If
 Next
 If Len(plus) > 1 Then
  ActiveCell.Offset(1).Formula = "=" & plus
 End If
 If Len(minus) > 1 Then
  ActiveCell.Offset(2).Formula = "=" & minus
 End If
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます! ロジックが非常にわかりやすいですし、スイッチがあって非常に便利です。

お礼日時:2017/08/19 21:56

もうちょっと具体的に、


A1に5
B1に-3
C1に7
D1に6
E1に=A1-B1+C1-D1
  で計算結果が9
って入ってたとして、

F1に=A1+C1
G1に=B1+D1
って式が入って、計算結果が12、3になって欲しいって事で良いの?

ワークシート関数で処理するのは面倒そうです。
VBAを使うなら、
・「+」を「@+」、「-」を「@-」にReplaceして、=A1@-B1@+C1@-D1
・「@」でSplitして「A1」「-B1」「+C1」「-D1」に分割
・1文字目が「-」かどうかで場合分けして2つの式に振り分け
とか。

--
上の条件でなら、

Sub test()
Call div_formula(Range("E1"), Range("F1"), Range("G1"))
End Sub
Sub div_formula(src As Range, d_plus As Range, d_minus As Range)
Dim src_f As String, dst_plus As String, dst_minus As String
Dim mem As Variant
Dim iCount As Long
src_f = src.Formula
If Left(src_f, 1) <> "=" Then Exit Sub ' 式が「=」ではじまらない
' 先頭の「=」は削除
src_f = Right(src_f, Len(src_f) - 1)
' 「+」を「@+」に置換
src_f = Replace(src_f, "+", "@+")
' 「-」を「@-」に置換
src_f = Replace(src_f, "-", "@-")
' 「@」で式を分割
mem = Split(src_f, "@")
dst_plus = "="
dst_minus = "="
' 各項ループ
For iCount = LBound(mem) To UBound(mem)
If Left(mem(iCount), 1) <> "-" Then ' 項の先頭文字が「-」でなければ
dst_plus = dst_plus & mem(iCount)
Else
dst_minus = dst_minus & "+" & Right(mem(iCount), Len(mem(iCount)) - 1)
End If
Next iCount
d_plus.Formula = dst_plus
d_minus.Formula = dst_minus
End Sub

で一応可能です。
2つ目の式は「=+B1+D1」ってなるし、式に「~+(B1-C1)+~」とかあったら、処理できないですが。
    • good
    • 0
この回答へのお礼

> って式が入って、計算結果が12、3になって欲しいって事で良いの?

はい! そうです。やはり関数だと難しいんですね。VBAマクロ試してみます

お礼日時:2017/08/19 18:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!