Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11809 / 13645 ツリー ←次へ | 前へ→

【13932】先程の関連なのですが・・・ よっしー 04/5/17(月) 16:03 質問[未読]
【13936】Re:先程の関連なのですが・・・ つん 04/5/17(月) 16:27 発言[未読]
【13938】Re:先程の関連なのですが・・・ Asaki 04/5/17(月) 16:30 発言[未読]
【13942】Re:先程の関連なのですが・・・ よっしー 04/5/17(月) 16:35 質問[未読]
【13945】Re:先程の関連なのですが・・・ Jaka 04/5/17(月) 17:25 回答[未読]
【13946】Re:先程の関連なのですが・・・ よっしー 04/5/17(月) 17:40 質問[未読]
【13972】Re:先程の関連なのですが・・・ Jaka 04/5/18(火) 10:28 発言[未読]
【13940】Re:先程の関連なのですが・・・ よっしー 04/5/17(月) 16:33 質問[未読]
【13953】Re:先程の関連なのですが・・・ ichinose 04/5/17(月) 21:03 発言[未読]
【14007】Re:先程の関連なのですが・・・ よっしー 04/5/18(火) 15:02 お礼[未読]

【13932】先程の関連なのですが・・・
質問  よっしー  - 04/5/17(月) 16:03 -

引用なし
パスワード
   度々すいません。
strGoukei = Cells(33, 7).FormulaR1C1
strGoukeiには"=SUM(R[6]C:R[10]C)+R[22]C-R[22]C"
の様な数式が入っています。
上記で行っているのは、"=SUM(R[6]C:R[10]C)"が
基本の数式で、その基本の数式に"+R[22]C"のように
あるセルの数値を足したり引いたりしています。
ですが、3行目の式のように"+R[22]C"をして"-R[22]C"
したらそのまま残ってしまいます。(当たり前の事とは思いますが・・・)
ではなく、"+R[22]C"をして"-R[22]C"すると、相殺して両方を
消したいのですが、可能でしょうか?
よろしくお願い致します。

【13936】Re:先程の関連なのですが・・・
発言  つん E-MAIL  - 04/5/17(月) 16:27 -

引用なし
パスワード
   よっしー さん、まいどです。

>strGoukei = Cells(33, 7).FormulaR1C1
>strGoukeiには"=SUM(R[6]C:R[10]C)+R[22]C-R[22]C"
>の様な数式が入っています。
>上記で行っているのは、"=SUM(R[6]C:R[10]C)"が
>基本の数式で、その基本の数式に"+R[22]C"のように
>あるセルの数値を足したり引いたりしています。
>ですが、3行目の式のように"+R[22]C"をして"-R[22]C"
>したらそのまま残ってしまいます。(当たり前の事とは思いますが・・・)
>ではなく、"+R[22]C"をして"-R[22]C"すると、相殺して両方を
>消したいのですが、可能でしょうか?

いまいち、なさりたい処理がわかりずらいです。
「+R[22]C-R[22]C」で、同じセルの値を、足して引いてしてるのだから、
相殺されてしまってますよね?
「そのまま残ってしまいます。」とおっしゃってるのはそのことだと
思いますが、「"+R[22]C"をして"-R[22]C"すると、相殺して両方を
消したいのですが」というのはどういう意味でしょうか?
「両方」って「+R[22]C」と「-R[22]C」のこと?
そしたら、それで相殺されてるような気がするんですけど・・・
(まるで意味はないような気がしますが・・)
最終的に、どういう形にされたいのでしょうか?

イマイチ読解力がなくて(^^;

【13938】Re:先程の関連なのですが・・・
発言  Asaki  - 04/5/17(月) 16:30 -

引用なし
パスワード
   こんにちは。

あるセルから数式を取得して
値が相殺するような項目があれば、その式から、相殺する項目そのものを除外する
でしょうか?

つまり
>=SUM(R[6]C:R[10]C)+R[22]C-R[22]C

=SUM(R[6]C:R[10]C)



【13940】Re:先程の関連なのですが・・・
質問  よっしー  - 04/5/17(月) 16:33 -

引用なし
パスワード
   つんさん、すいません。
分かりづらい説明になっていしまいました。
両方を相殺したいというか、(相殺されてますね・・・)
数式バーのところなんですが、
=SUM(R[6]C:R[10]C)+R[22]C-R[22]C+R[24]C
となっているのを
=SUM(R[6]C:R[10]C)+R[24]C
という風にしたいのですが
可能でしょうか?
よろしくお願い致します。

【13942】Re:先程の関連なのですが・・・
質問  よっしー  - 04/5/17(月) 16:35 -

引用なし
パスワード
   Asakiさん、こんにちわ。
まさにその通りです。
可能であれば、よろしくお願い致します。


▼Asaki さん:
>こんにちは。
>
>あるセルから数式を取得して
>値が相殺するような項目があれば、その式から、相殺する項目そのものを除外する
>でしょうか?
>
>つまり
>>=SUM(R[6]C:R[10]C)+R[22]C-R[22]C
> ↓
>=SUM(R[6]C:R[10]C)
>
>?

【13945】Re:先程の関連なのですが・・・
回答  Jaka  - 04/5/17(月) 17:25 -

引用なし
パスワード
   こんにちは。
これで、+の位置がわかりますから、Left、Mid関数で文字を取り出せます。
最後に)を付け加えればいいと思います。

MsgBox InStr(1, "=SUM(R[6]C:R[10]C)+R[22]C-R[22]C+R[24]C", "+")

【13946】Re:先程の関連なのですが・・・
質問  よっしー  - 04/5/17(月) 17:40 -

引用なし
パスワード
   Jakaさん、ありがとうございます。
何となく理解できそうなのですが、
もう少し、詳しく教えて頂く事はでき
ないでしょうか?
よろしくお願い致します。

【13953】Re:先程の関連なのですが・・・
発言  ichinose  - 04/5/17(月) 21:03 -

引用なし
パスワード
   ▼よっしー さん、皆さん、こんばんは(再々送です)。

>strGoukei = Cells(33, 7).FormulaR1C1
>strGoukeiには"=SUM(R[6]C:R[10]C)+R[22]C-R[22]C"
>の様な数式が入っています。
>上記で行っているのは、"=SUM(R[6]C:R[10]C)"が
>基本の数式で、その基本の数式に"+R[22]C"のように
>あるセルの数値を足したり引いたりしています。
>ですが、3行目の式のように"+R[22]C"をして"-R[22]C"
>したらそのまま残ってしまいます。(当たり前の事とは思いますが・・・)
>ではなく、"+R[22]C"をして"-R[22]C"すると、相殺して両方を
>消したいのですが、可能でしょうか?
>よろしくお願い致します。
一番、単純なパターンのロジックでさえ、何度も間違えました。
(まだあるかも・・・・)
基本数式の続きは、セルアドレスの単純な足し算・引き算のみです。


標準モジュールに

'==================================================================
Sub test()
  Dim aaa As String
  Dim a()
  aaa = "=SUM(R[6]C:R[10]C)+R[22]C-R[22]C+R[24]C+R[22]C-R[22]C-R[22]C"
'      解析対象数式

  If 文字列分解(aaa, "=sum\(.+\)", ans1, "(\+|-)r(\[?[0-9]*\]?)c(\[?[0-9]*\]?)", a()) = True Then
'            ↑基本数式の抜き取り(この場合、=sum(・・))
'                        符号付セルアドレスの抜き取り

   Call init_演算 '内部データの初期化
   For idx = LBound(a()) To UBound(a())
     Call put_演算(a(idx)) 'セルアドレスの検索&登録
     Next
   ans = ans1 & ans_演算() '加工後の数式の設定
   Call init_演算
   End If
MsgBox ans
End Sub

'========================================================================
Function 文字列分解(strng, 基本数式, o_基本数式, 正規表現, a_array()) As Boolean
  Dim regEx, Match, Matches  ' 変数を作成します。
  Dim wk
  Set regEx = CreateObject("VBScript.RegExp")
  o_基本数式 = ""
  regEx.Pattern = "^" & 基本数式
  regEx.IgnoreCase = True  ' 大文字と小文字を区別しないように設定します。
  regEx.Global = True  ' 文字列全体を検索するように設定します。
  Set Matches = regEx.Execute(strng)  ' 検索を実行します。
  If Matches.Count = 1 Then
   o_基本数式 = Matches(0).Value
   wk = Replace(strng, o_基本数式, "")
  Else
   wk = strng
   End If
  regEx.Pattern = 正規表現
  regEx.IgnoreCase = True  ' 大文字と小文字を区別しないように設定します。
  regEx.Global = True  ' 文字列全体を検索するように設定します。
  Set Matches = regEx.Execute(wk)  ' 検索を実行します。
  idx = 1
  For Each Match In Matches  ' Matches コレクションに対して繰り返し処理を行います。
   ReDim Preserve a_array(1 To idx)
   a_array(idx) = Match.Value
   idx = idx + 1
  Next
  Set regEx = Nothing
  Set Match = Nothing
  Set Matches = Nothing
  If idx > 1 Then
   文字列分解 = True
  Else
   文字列分解 = False
   End If
End Function

別の標準モジュールに
'====================================================================
Private data_array()
Private dcnt_array() As Long
Private d_idx As Long
'=====================================================================
Sub init_演算()
  Erase data_array
  Erase dcnt_array
  d_idx = 0
End Sub
'=====================================================================
Sub put_演算(f_data)
  Dim f_wk
  Dim retcode As Long
  retcode = 1
  If d_idx > 0 Then
   For idx = LBound(data_array()) To UBound(data_array())
     If UCase(data_array(idx)) = UCase(Mid(f_data, 2)) Then
      If Mid(f_data, 1, 1) = "+" Then
       dcnt_array(idx) = dcnt_array(idx) + 1
      Else
       dcnt_array(idx) = dcnt_array(idx) - 1
       End If
      retcode = 0
      End If
     Next
   End If
  If retcode = 1 Then
   ReDim Preserve data_array(1 To d_idx + 1)
   data_array(d_idx + 1) = Mid(f_data, 2)
   ReDim Preserve dcnt_array(1 To d_idx + 1)
   If Mid(f_data, 1, 1) = "+" Then
     dcnt_array(d_idx + 1) = 1
   Else
     dcnt_array(d_idx + 1) = -1
     End If
   d_idx = d_idx + 1
   End If
End Sub
'======================================================================
Function ans_演算()
  ans_演算 = ""
  If d_idx > 0 Then
   For idx = LBound(data_array()) To UBound(data_array())
     If dcnt_array(idx) <> 0 Then
      If dcnt_array(idx) > 0 Then
        演算子 = "+"
      Else
        演算子 = "-"
        End If
      For jdx = 1 To Abs(dcnt_array(idx))
        ans_演算 = ans_演算 & 演算子 & data_array(idx)
        Next
      End If
     Next
   End If
End Function

これでプロシジャーtestを実行して下さい。
ということできっちりやるには、すごく大変そうです。

【13972】Re:先程の関連なのですが・・・
発言  Jaka  - 04/5/18(火) 10:28 -

引用なし
パスワード
   こんにちは。
ichinoseさんの難しそうなコードを見て、よく読んでみたら、
単純に、これだけで済むような物じゃなかったんですね。
MsgBox InStr(1, "=SUM(R[6]C:R[10]C)+R[22]C-R[22]C+R[24]C", "+")

でも、何でR1C1形式なんでしょう?
Formulaで、取り出した方が楽なような気もしましたけど。
すみません。

【14007】Re:先程の関連なのですが・・・
お礼  よっしー  - 04/5/18(火) 15:02 -

引用なし
パスワード
   ichinoseさん、ありがとうございます。
理解できないかもしれないですが、
がんばってやってみます。
どうもありがとうございました。

11809 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free