使用Select Distinct并编辑第二列

时间:2018-06-04 04:29:42

标签: ms-access access-vba

我有一个从另一个表中绘制的唯一名称列表。

我想知道我是否可以同时使用相同的SQL查询将输出从这些不同的值中删除特殊字符到另一列?

这是因为我随后必须使用这些名称作为表名,其中一些名称有问题,例如太长或包含特殊字符。

我有一个Function(),它返回vba代码中的过滤字符串,但不确定如何将其合并到SQL查询中。

这是我现在使用的查询:

SQL = "INSERT INTO [ClientNameList] (ClientName) SELECT DISTINCT TempName.[ClientName] FROM TempName"

输出:

Table Name: ClientNameList
ID  ClientName  TableName
1   Cat.        Cat
2   Dog!        Dog
3   MooMoo?     MooMoo

1 个答案:

答案 0 :(得分:0)

您可以使用/修改此功能:

' Returns a cleaned and truncated string suitable as a code module name.
'
' 2017-03-06. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function TrimModuleCodeName( _
    ByVal Name As String) _
    As String

    CleanModuleCodeName Name

    TrimModuleCodeName = Name

End Function

使用此功能:

' Replaces characters in CodeName that are not allowed in a module codename.
' Truncates length of CodeName to MaxModuleCodeNameLength.
' Returns the cleaned name by reference.
'
' 2017-03-06. Gustav Brock, Cactus Data ApS, CPH.
'
Public Sub CleanModuleCodeName(ByRef CodeName As String)

    ' Maximum length of a module codename in Excel.
    Const MaxModuleCodeNameLength   As Long = 31
    ' String containing all not allowed characters.
    Const InvalidCharacters         As String = "\/,;.:*?'`""<>|()[]{} @#$%&=+-~^"
    ' String containing all not allowed leading characters.
    Const InvalidLeadCharacters     As String = "_0123456789"

    ' Character to replace not allowed characters.
    Const ReplaceCharacter          As String * 1 = "_"
    ' Character to replace not allowed characters.
    Const ReplaceLeadCharacter      As String * 1 = "M"

    Dim Length          As Integer
    Dim Position        As Integer
    Dim Character       As String
    Dim TrimmedCodeName As String

    ' Strip doubled spaces.
    While InStr(CodeName, Space(2)) > 0
        CodeName = Replace(CodeName, Space(2), Space(1))
    Wend
    ' Strip leading and trailing spaces and limit length of codename.
    TrimmedCodeName = Left(Trim(CodeName), MaxModuleCodeNameLength)
    Length = Len(TrimmedCodeName)
    ' Replace invalid characters.
    For Position = 1 To Length Step 1
        Character = Mid(TrimmedCodeName, Position, 1)
        If InStr(InvalidCharacters, Character) > 0 Then
            Mid(TrimmedCodeName, Position) = ReplaceCharacter
        End If
    Next
    ' Replace a leading invalid character:
    Character = Left(TrimmedCodeName, 1)
    If InStr(InvalidLeadCharacters, Character) > 0 Then
        Mid(TrimmedCodeName, 1) = ReplaceLeadCharacter
    End If

    ' Return cleaned code name.
    CodeName = TrimmedCodeName

End Sub

然后:

SQL = "INSERT INTO [ClientNameList] (ClientName) SELECT DISTINCT TrimModuleCodeName(TempName.[ClientName]) FROM TempName"