【问题标题】:Special Char. replacement for different countries特殊字符。不同国家的替代品
【发布时间】:2018-11-13 20:20:05
【问题描述】:

我目前正在使用一个 excel 宏,它应该为不同的国家/地区替换不同的特殊字符。 每个国家都在替换特殊字符。另一种方式。

例如:

  • 德国正在用“AE”代替“Ä”
  • 比利时正在用“A”替换“Ä”

表格如下:

A 列:名字

B 列:中间名

C 列:姓氏

D 列:国家

宏应首先检查 Excel 中列出的国家/地区,然后替换特殊字符。在 A 和 C 列中。

实际代码:

Sub UmlauteErsatezen()
    Dim Sh As Worksheet

    If cell D:D = "Germany" then
        For Each Sh In ActiveWorkbook.Worksheets
            With Sh.UsedRange
                .Replace What:="Ö", Replacement:="oe", LookAt:=xlPart, _
                  SearchOrder:=xlByRows, MatchCase:=True
                .Replace What:="Ü", Replacement:="ue"
                .Replace What:="Ä", Replacement:="ae"

    else if cell D:D ="Belgium" then
       For Each Sh In ActiveWorkbook.Worksheets
           With Sh.UsedRange
                .Replace What:="Ö", Replacement:="o", LookAt:=xlPart, _
                  SearchOrder:=xlByRows, MatchCase:=True
                .Replace What:="Ü", Replacement:="u"
                .Replace What:="Ä", Replacement:="a"

    End If

End With

Next
End If
End Sub

有什么想法吗?

【问题讨论】:

  • 您的代码似乎可以正常工作。它有什么问题?
  • @Vityata 真的吗?我将代码缩进了一点,它充满了错误。多个NextEnd With 丢失或位于错误的位置。我认为这甚至不会编译。
  • 您离得并不远...在哪个表格/单元格中存储了国家名称(例如“德国”)?
  • @Pᴇʜ - 在某种程度上 :) - 这部分 LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=True 来自宏记录器,因此 OP 可以自己管理。
  • @Atlantikdriver 请确保您在问题中显示的代码正是您使用的代码。几个End WithNext 语句在错误的位置。正确缩进/格式化您的代码,以便您可以轻松查看它。如果可能,还要添加工作表的屏幕截图(不清楚需要检查哪个单元格的国家/地区。

标签: vba excel


【解决方案1】:

如果你想检查,是否在单元格 D1 中写着“德国”,然后这样写:

If Range("D1") = "Germany" Then

If cell D:D = "Germany" then 会产生编译错误。

【讨论】:

    【解决方案2】:

    您可以使用 Select Case 或创建要与 VLOOKUP 一起使用的表

    Select Case 方法示例

    Sub UmlauteErsatezen()
        Dim Sh As Worksheet
        Dim iCell As Range
        Dim vArr(), vArrSub()
        Dim i As Long
        
        For Each Sh In Thisworkbook.Worksheets
            For Each iCell in Sh.UsedRange.Columns("D").Cells
                Erase vArr : Erase vArrSub
                Select Case iCell.Value
                    Case "Germany"
                        vArr = Array("Ö", "Ü", "Ä")
                        vArrSub = Array("oe", "ue", "ae")
                    Case "Belgium"
                        vArr = Array("Ö", "Ü", "Ä")
                        vArrSub = Array("o", "u", "a")
                    Case Else
                        'Think of something
                End Select
                For i = Lbound(vArr) To Ubound(vArr)
                    Intersect(iCell.EntireRow, _
                              Sh.UsedRange).Replace vArr(i), _
                                                    vArrSub(i), _
                                                    xlPart
                Next i
            Next
        Next
    End Sub
    

    我并不是说这些是回答问题的唯一方法。

    【讨论】:

    • SpecialCells(xlCellTypeConstants) 有点危险,因为它忽略了带有公式的单元格。而在 Excel 中,大约有一半的单元格是这样的。
    • @Vityata 是的,知道这一点。我会选择Sh.UsedRange.Columns("D").Cells,但我不知道他有什么样的数据以及它的位置,更不用说他的表格是否有任何标题。
    • 是的。但可能在标题中ü 也应该替换为au。猜...
    • @Vityata 是的,这就是我想做的事情
    猜你喜欢
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2014-11-03
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    相关资源
    最近更新 更多