8

MS Access 2007 プロジェクト レポートには、次の (編集された) クエリがあります。

SELECT SomeCol FROM SomeTable

問題は、SomeCol明らかに見えない文字が含まれていることです。たとえば、1 つの結果123456が but SELECT LEN(SomeCol)returnsとして返されます7。結果を Notepad++ にコピーすると、次のように表示され?123456ます。

列は に設定されていTEXTます。このデータ型を制御できないため、変更できません。

SELECTクエリを変更して、数値以外のものを削除するにはどうすればよいですか。私はRegExが行くべき道だと思います...代わりに、CASTまたはCONVERT関数はありますか?

4

4 に答える 4

10

これには正規表現を使用すると述べました。Access の db エンジンが正規表現を直接サポートしていないことは事実です。ただし、クエリで VBA ユーザー定義関数を使用する意思があるようです...そして UDF は正規表現アプローチを使用できます。このアプローチは、入力文字列の各文字を繰り返し処理し、保持したい文字だけを新しい出力文字列に格納するよりも、シンプルで簡単で高速に実行できるはずです。

Public Function OnlyDigits(ByVal pInput As String) As String
    Static objRegExp As Object

    If objRegExp Is Nothing Then
        Set objRegExp = CreateObject("VBScript.RegExp")
        With objRegExp
            .Global = True
            .Pattern = "[^\d]"
        End With
    End If
    OnlyDigits = objRegExp.Replace(pInput, vbNullString)
End Function

非表示の文字のプロキシとして "x" 文字を使用したイミディエイト ウィンドウでのその関数の例を次に示します。( 「数字」文字クラスに含まれない文字はすべて破棄されます。)

? OnlyDigits("x1x23x")
123

それが必要な出力である場合は、クエリで関数を使用してください。

SELECT OnlyDigits(SomeCol) FROM SomeTable;
于 2012-09-24T18:16:57.440 に答える
2

Access には正規表現はありません。少なくとも SQL にはありません。VBA に挑戦する場合は、SQL ステートメントでカスタム StripNonNumeric VBA 関数を使用することもできます。

例えばSELECT StripNonNumeric(SomeCol) as SomeCol from SomeTable

Function StripNonNumeric(str)
      keep = "0123456789"
      outstr = ""
      For i = 1 to len(str)
          strChar = mid(str,i,1)
          If instr(keep,strChar) Then
              outstr = outstr & strChar
          End If
      Next
      StripNonNumeric = outstr
  End Function
于 2012-09-24T11:37:56.207 に答える
0

この質問を前の質問と組み合わせて、クエリですべてを行うことができます。次のようになります。

SELECT IIf(IsNumeric([atext]),
           IIf(Len([atext])<4,Format([atext],"000"),
               Replace(Format(Val([atext]),"#,###"),",",".")),
           IIf(Len(Mid([atext],2))<4,Format(Mid([atext],2),"000"),
               Replace(Format(Val(Mid([atext],2)),"#,###"),",","."))) AS FmtNumber
FROM Table AS t;
于 2012-09-24T11:50:51.443 に答える
0
Public Function fExtractNumeric(strInput) As String
' Returns the numeric characters within a string in
' sequence in which they are found within the string
Dim strResult As String, strCh As String
Dim intI As Integer
If Not IsNull(strInput) Then
    For intI = 1 To Len(strInput)
        strCh = Mid(strInput, intI, 1)
        Select Case strCh
            Case "0" To "9"
                strResult = strResult & strCh
            Case Else
        End Select
    Next intI
End If
fExtractNumeric = strResult

終了機能

于 2016-10-28T07:07:02.347 に答える