Excel VBA質問箱 IV

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

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


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

【49003】複雑な文字列処理 GHQ 07/5/20(日) 21:13 質問[未読]
【49004】Re:複雑な文字列処理 Kein 07/5/20(日) 22:13 回答[未読]
【49177】Re:複雑な文字列処理 GHQ 07/5/26(土) 11:29 お礼[未読]
【49005】Re:複雑な文字列処理 Hirofumi 07/5/20(日) 22:20 回答[未読]
【49006】Re:複雑な文字列処理 Hirofumi 07/5/20(日) 22:55 回答[未読]
【49178】Re:複雑な文字列処理 GHQ 07/5/26(土) 11:52 お礼[未読]

【49003】複雑な文字列処理
質問  GHQ  - 07/5/20(日) 21:13 -

引用なし
パスワード
   こんばんは
 ある文字列を細分化して、計算をおこないたいですが、Excelの関数はあまりしらないから、試行錯誤でやっていますが、前進行かずに、この掲示板に投稿しました。

金属疲労計算には、以下の配分規格(文字列)があります。計算時、配分要素をもって、
文字列に同じ要素の階層から最後の階層までの係数の掛け算になります。


試験項目 配分規格           配分要素 結果
type1  2Zn×45C×2Fe×7Si×1P×14H  C    8820  45×2×7×1×14
type2  2Er×45C×2Fe×7S       Er    1260  2×45×2×7
type3  2Lu×45C×2Fe×7Si×1P×14H  P    14   1×14
type4  2Zn×45C×2Fe×7Si×1P×14H  H    1    1 最後の階層は1

【49004】Re:複雑な文字列処理
回答  Kein  - 07/5/20(日) 22:13 -

引用なし
パスワード
   その表が A1 から入力されているとして、こんなコードでできると思います。
表のあるシートを開いて、実行してみてください。

Sub MyCalc()
  Dim C As Range
  Dim CkS As String
  Dim V As Variant
  Dim X As Long
 
  For Each C In Range("B2", Range("B65536").End(xlUp))
   CkS = C.Offset(, 1).Value
   If Right$(C.Value, Len(CkS)) = CkS Then
     C.Offset(, 2).Value = 1
   Else
     For Each V In Split(C.Value, "×")
      If Right$(CStr(V), Len(CkS)) = CkS Then
        X = Val(V)
      Else
        If X > 0 Then X = X * Val(V)
      End If
     Next
     C.Offset(, 2).Value = X: X = 0
   End If
  Next
End Sub

【49005】Re:複雑な文字列処理
回答  Hirofumi  - 07/5/20(日) 22:20 -

引用なし
パスワード
   配分規格と配分要素から結果を得ると言う事で
ユーザー定義関数にするとこんなかな?

Option Explicit

Public Function Coefficient(vntStandard As Variant, vntElement As Variant) As Variant

'  vntStandard : 配分規格
'  vntElement : 配分要素
  
  Dim i As Long
  Dim vntList As Variant
  Dim vntResult As Variant
  
  '戻り値としてエラー値をセット
  Coefficient = CVErr(xlErrValue)
  
  '配分規格、配分要素が""ならFunctionを抜ける
  If vntStandard = "" Or vntElement = "" Then
    Exit Function
  End If
  
  '配分規格を"×"で配列に分割
  vntList = Split(vntStandard, "×", , vbBinaryCompare)
  '配分規格に配分要素が有るか探索
  For i = 0 To UBound(vntList)
    '有る場合はForを抜ける
    If InStr(1, vntList(i), vntElement, vbBinaryCompare) > 0 Then
      Exit For
    End If
  Next i
  '結果に予め1を代入
  vntResult = 1
  '配分規格に配分要素が有る場合
  If i < UBound(vntList) Then
    '係数を乗算
    For i = i To UBound(vntList)
      vntResult = vntResult * Val(vntList(i))
    Next i
  Else
    '無い場合Functionを抜ける
    If i > UBound(vntList) Then
      Exit Function
    End If
  End If
  
  '戻り値として計算結果を返す
  Coefficient = vntResult
  
End Function

引数vntStandardに配分規格、vntElementに配分要素を与えて下さい

【49006】Re:複雑な文字列処理
回答  Hirofumi  - 07/5/20(日) 22:55 -

引用なし
パスワード
   アルファベットの所は、元素記号か何かの様ですね?
その場合、今のままだと

配分規格が例えば、2Cr×45C×2Fe×7Si×1P×14Hで
配分要素がCだと、Crの所から計算してしまいますので
以下の様に変更して下さい

  For i = 0 To UBound(vntList)
    '有る場合はForを抜ける
'    If InStr(1, vntList(i), vntElement, vbBinaryCompare) > 0 Then '★削除
    If vntList(i) Like "*" & vntElement Then '☆追加
      Exit For

【49177】Re:複雑な文字列処理
お礼  GHQ  - 07/5/26(土) 11:29 -

引用なし
パスワード
   Keinさん
ヒントをいただき、ありがとうございました。

【49178】Re:複雑な文字列処理
お礼  GHQ  - 07/5/26(土) 11:52 -

引用なし
パスワード
   Hirofumiさん

 『配分規格』の一部記号には確かに化学元素符号が含まれています。
 早速、試験データを使って、試しましたので、正確に動いてくれました。
本当にありがとうございました。

47000のデータを計算しても、ストレスが感じなくて、快適です。

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