2

次のような数字とスペースを削除する必要がある列があります。

    XX = 
TERR
6 ST
3 ST
4 ST
 AVE
2 PL
2 PL
2 PL
2 PL
4 CT
2 PL
4 ST
3 ST
3 ST

つまり、Val()とは反対の関数が必要ですが、見つかりません。何か案は?ありがとう!

4

2 に答える 2

3

このための関数は実際にはありませんが、すべてのテキストがNUMBER TEXTまたはTEXTNUMBER TEXT NUMBERではない)のいずれかの形式である限り、次を使用できます。

TRIM(Replace(Column, VAL(Column), '')) AS Result

基本的には、を使用VALしてテキスト内の番号を検索し、それを空白スペースに置き換えて、残りをトリミングします。

于 2012-12-05T19:08:59.830 に答える
1

の逆関数のような単純な関数で、Val()すべての非英字を破棄する必要があります。私はそのようなことは何も知りません。ただし、正規表現に基づく解決策は簡単です。以下の関数は、文字ではないすべての文字を破棄します。これが、いくつかのサンプル入力に適用される関数です。

? OnlyAlpha("TERR")
TERR
? OnlyAlpha("6 ST")
ST
? OnlyAlpha(" AVE")
AVE

この機能は、Accessアプリケーションセッション内から使用する必要があります。従来のASP、VBScript、Dot.Netなど、Accessの外部から実行されるクエリで使用する場合は使用できません。

Public Function OnlyAlpha(ByVal strSource As String) As String
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")

    re.Global = True
    re.IgnoreCase = True
    re.pattern = "[^a-z]"
    OnlyAlpha = re.Replace(strSource, vbNullString)
    Set re = Nothing
End Function

コメントでパフォーマンスについて考えさせられたので、パフォーマンスが大幅に向上すると思われるこのバージョンを提供します。

Public Function OnlyAlpha(ByVal strSource As String) As String
    ' early binding requires reference to Microsoft
    ' VBScript Regular Expressions:
    'Static re As RegExp
    ' with late binding, no reference needed:
    Static re As Object

    If re Is Nothing Then
        'Set re = New RegExp ' early binding
        Set re = CreateObject("VBScript.RegExp") ' late binding
        re.Global = True
        re.IgnoreCase = True
        re.pattern = "[^a-z]"
    End If

    OnlyAlpha = re.Replace(strSource, vbNullString)
End Function

そのコードをレイトバインディングからアーリーバインディングに簡単に切り替えることができます。早期バインディングは、Intellisenseが支援できるため、開発中に役立ちます。また、場合によっては、早期のバインドが大幅に高速化されます。ただし、この場合、RegExpオブジェクトは一度作成され、後で関数を呼び出すために再利用されます。オブジェクト作成中の早期バインディングによる速度の利点は重要ではありません。

于 2012-12-05T19:22:57.550 に答える