Ms access 使用Select Distinct并编辑第二列中的输出

Ms access 使用Select Distinct并编辑第二列中的输出,ms-access,vba,Ms Access,Vba,我有一个从另一个表中提取的唯一名称列表 我想知道是否可以同时使用相同的SQL查询将特殊字符从这些不同的值中删除到另一列中 这是因为我随后将不得不使用这些名称作为表名,其中一些名称存在命名问题,例如太长或包含特殊字符 我确实有一个函数(),它在vba代码中返回一个过滤字符串,但不确定如何将其合并到SQL查询中 这是我现在使用的查询: SQL = "INSERT INTO [ClientNameList] (ClientName) SELECT DISTINCT TempName.[ClientNa

我有一个从另一个表中提取的唯一名称列表

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

这是因为我随后将不得不使用这些名称作为表名,其中一些名称存在命名问题,例如太长或包含特殊字符

我确实有一个
函数()
,它在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

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

' 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
使用此功能的:

' 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

是否总是只有一个特殊字符位于末尾?使用Left和Len函数:
Left(ClientName,Len(ClientName)-1)
。为什么每个ClientName都有一个表?不,字符串中也有特殊字符。大多数公司的名字都很常见,比如“布拉布拉私人有限公司”、“吉姆的面包店”或“购物中心的Ace”。所以你想以“JimsBakery”和“AcetheMall”结尾?没有实现这一点的内在功能。创建VBA自定义函数。命名约定中可以使用特殊字符,但不建议使用。没有回答其他问题。你到底为什么要为每个客户安排一张桌子?啊,我很抱歉。我已将各个客户的消费数据存储在各个表中。因此,这个包含所有名称的表就像一个映射表,知道客户机名称会将用户引导到相应的表。是的,我也怀疑。然后我将循环代码。谢谢整洁?每次你得到一个新的客户端,你就必须创建一个新的表?这实际上是糟糕的关系数据库设计。功能数据库应该很少需要修改设计。应该是一个表和另一个客户端字段(实际上应该是ID而不是name)。此外,在某个时候,您将需要将所有这些数据放在一个数据集中,并且必须借助联合查询来完成。通过筛选分离数据比合并更容易。