4

特定の文字列内の可変数の値を置き換えるルーチンを作成しようとしています。たとえば、スプレッドシートに次のベース テキストがあるとします。

「車両の {0} の選択は、{1} から {2} のタイヤが必要であることを示しています。ただし、この車両には {3} 個のタイヤが入力されています。それに応じて記録を更新してください。」</p>

トークンを、アプリケーションからの定数値またはユーザーが入力した他の変数に置き換えたいと思います。次のようなシグネチャを持つルーチンを作成しようとしています。ここで、RowID はベース テキストが配置されているスプレッドシートの行であり、ReplacementValues は n 個の変数の配列です。

Sub ShowMsg(ByVal RowID As Integer, Optional ByVal ReplacementValues As Variant)

各反復で基本メッセージのテキスト全体を繰り返さずに、テキストをループして各トークンを置き換える方法がわかりません。可能であれば、後でアプリケーションをデータベースに移動する必要がある場合に備えて、Excel に固有のものではなく、かなり一般的なルーチンを維持したいと考えています。

これについて十分に説明したことを願っています。任意の助けをいただければ幸いです。

4

3 に答える 3

2

あなたはできる;

Sub ShowMsg(ByVal RowID As Integer, Optional ReplacementValues As Variant)
Dim data As String, i As Long
If Not IsMissing(ReplacementValues) Then
    data = Range("A" & RowID).Value
    For i = 0 To UBound(ReplacementValues)
        data = Replace(data, "{" & i & "}", ReplacementValues(i))
    Next
    msgbox data
End If
End Sub

で呼び出されます。

Dim a() As Variant: a = Array("aa", "bb", "cc")
ShowMsg 8, a

または別の方法:

Sub ShowMsg(ByVal RowID As Integer, ParamArray ReplacementValues() As Variant)
Dim data As String, i As Long
If Not IsMissing(ReplacementValues) Then
    data = Range("A" & RowID).Value
    If IsArray(ReplacementValues(0)) Then ReplacementValues = ReplacementValues(0)
    For i = 0 To UBound(ReplacementValues)
        data = Replace(data, "{" & i & "}", ReplacementValues(i))
    Next
    msgbox data
End If
End Sub

これは、同じ方法で、または追加で序数引数を使用して呼び出すことができます。

ShowMsg 8, "aa", "bb", "cc"
于 2012-05-21T14:55:47.197 に答える
1

最初にベース文字列を次のように変更します

BaseString = "Your vehicle selection of {VEHSEL} indicates you should have " & _
             "between {nTYRE1} and {nTYRE2} tires. However, you have entered " & _
             "{nTotTYRE} tires for this vehicle. Please update the record " & _
             "accordingly."

次のような特定のキーワードがあることに気付いた場合は、

VEHSEL - Vehicle Selection
nTYRE1 - Lowest selection of tires
nTYRE2 - Highest selection of tires
nTotTYRE - Total tires selected

スプレッドシートから値を取得したら、上記のキーワードを関連する値REPLACEに置き換えるだけです。

したがって、コードは次のようになります

Option Explicit

Sub Sample()
    Dim lVSell As Long, lT1  As Long, lT2  As Long, ltotT As Long
    Dim lRowID As Long

    lRowID = 5

    With Sheets("Sheet1")
        lVSell = .Range("A" & lRowID).Value
        lT1 = .Range("B" & lRowID).Value
        lT2 = .Range("C" & lRowID).Value
        ltotT = .Range("D" & lRowID).Value

        Debug.Print ShowMsg(lRowID, lVSell, lT1, lT2, ltotT)
    End With
End Sub

Function ShowMsg(ByVal RowID As Integer, ByVal VSel As Long, _
ByVal T1 As Long, ByVal T2 As Long, ByVal totT As Long) As String
    Dim BaseString As String

    BaseString = "Your vehicle selection of {VEHSEL} indicates you should have " & _
                 "between {nTYRE1} and {nTYRE2} tires. However, you have entered " & _
                 "{nTotTYRE} tires for this vehicle. Please update the record " & _
                 "accordingly."

    BaseString = Replace(BaseString, "VEHSEL", VSel)
    BaseString = Replace(BaseString, "nTYRE1", T1)
    BaseString = Replace(BaseString, "nTYRE2", T2)
    BaseString = Replace(BaseString, "nTotTYRE", totT)

    ShowMsg = BaseString
End Function

A5 から D5 の範囲の値がシート 1 に格納されていると想定しています。

編集

スナップショット

ここに画像の説明を入力 HTH

于 2012-05-21T14:55:28.850 に答える
0

あなたはこれを試すことができます

Sub test()
    Dim x As Variant
    x = Split("<String0>,<String1>,<String2>", ",")
    ShowMsg 23, "A", x
End Sub

Sub ShowMsg(ByVal RowID As Integer, ColID As String, Optional ByVal ReplacementValues As Variant)
    Dim nText$
    nText = Cells(RowID, ColID)
    For pos = LBound(ReplacementValues) To UBound(ReplacementValues)
        Dim searchtext$
        searchtext = "{" & CStr(pos) & "}"
        nText = Replace(nText, searchtext, ReplacementValues(pos))
    Next pos
    MsgBox nText
End Sub
于 2012-05-21T15:08:12.370 に答える