Excel 基于另一单元格中的文本替换字符串的一部分

Excel 基于另一单元格中的文本替换字符串的一部分,excel,vba,Excel,Vba,5:00AM 5:13AM 上午6:10点6:26点 6:40上午6:56上午 上午7:25,上午7:41 上午8:15 8:28 上午9:10点9:24点 上午10:10:23 上午11:10点11:26点 下午12:02分12:15分 下午12:50 1:06 我试图创建一个宏,如果上面的单元格有am或PM,我需要用没有am和PM的时间替换当前单元格中的am或PM 例如,第一行中的时间保持不变,第二行中的行只显示6:10和6:26这样的时间,因为上面的单元格有AM。PM行也是如此。包含PM的

5:00AM 5:13AM
上午6:10点6:26点
6:40上午6:56上午
上午7:25,上午7:41
上午8:15 8:28
上午9:10点9:24点
上午10:10:23
上午11:10点11:26点
下午12:02分12:15分
下午12:50 1:06

我试图创建一个宏,如果上面的单元格有am或PM,我需要用没有am和PM的时间替换当前单元格中的am或PM

例如,第一行中的时间保持不变,第二行中的行只显示6:10和6:26这样的时间,因为上面的单元格有AM。PM行也是如此。包含PM的第一行保持不变,但后面的行仅显示数字

我目前的代码是这样的,它似乎不起作用。。我的excel文件刚刚崩溃,必须重新启动excel

“删除额外的AM和PM
我和我一样长,我和我一样长
将单元格文本设置为字符串
对于i=2到200
j=3

当j时执行,我认为您需要尝试以下代码:

'Remove additional AM and PM    
Dim i as Long, j as Long
Dim celltxt as String

    For i= 2 To 200
        For j = 3 To 49
            celltxt = Cells(i-1,j).Text
            If InStr( 1, celltext,("AM" Or "PM")) Then
            Cells(i,j).Replace What:="AM" Or "PM", Replacement:=" ", SearchOrder:=xlByColumns, MatchCase:=True
            Else
            End If
        Next j
    Next i
End Sub
你的代码崩溃了,因为你没有增加内部循环的计数器(
j
),所以代码被困在一个无休止的循环中(使用调试器时很容易理解)

2) 我认为替换不接受
-子句。相反,您必须发出两个单独的replace语句

3) 没有理由对所有数据进行循环。您可以一次替换所有字符串(可能需要调整范围的地址):


4) 也许更好的解决方案是用字符串创建真实的日期并正确设置格式。

我想我已经解决了

'Remove additional AM and PM
    For m = 100 To 2 Step -1
        For n = 3 To 30
                celltxt = Cells(m - 1, n).Text
                    If celltxt Like "*AM*" Then
                        Cells(m, n).Replace What:="AM", Replacement:=" "
                    Else
                    End If
        Next n
    Next m
    For m = 100 To 2 Step -1
        For n = 3 To 30
                celltxt = Cells(m - 1, n).Text
                    If celltxt Like "*PM*" Then
                        Cells(m, n).Replace What:="PM", Replacement:=" "
                    Else
                    End If
        Next n
    Next m
    For m = 100 To 2 Step -1
        For n = 3 To 30
                celltxt = Cells(m - 1, n).Text
                    If celltxt Like "*-*" Then
                        Cells(m, n).Replace What:="PM", Replacement:=" "
                    Else
                    End If
        Next n
    Next m
    For m = 100 To 2 Step -1
        For n = 3 To 30
                celltxt = Cells(m - 1, n).Text
                    If celltxt Like "*-*" Then
                        Cells(m, n).Replace What:="AM", Replacement:=" "
                    Else
                    End If
        Next n
    Next m
End Sub

如果单元格格式为时间(因此不是字符串),则需要使用自定义格式以满足需要。选择您的范围,右键单击>设置单元格格式>自定义。然后键入:
h:mm
。您的值是真时间还是看起来像时间的文本?单元格是右对齐还是左对齐?您是否手动更改单元格对齐方式?当前单元格的格式为“常规”,未对对齐方式进行任何更改。我的问题是,您为什么要尝试从单元格中删除AM或PM?这是出于美学原因还是因为您试图引用单元格中的值,以及它给您带来的问题?如果是后者,则有更好的选项可用,而不是尝试删除部分string@PranjalDixit这不是我要的!!!!!!!为什么你要向后循环?b) 使用4个循环,而不是一个c)将单元格的内容分配给字符串变量(
.Replace
无论如何都可以)d)检查所有的
*-*
e)在您的单元格中所有的
循环中都有空的
或者
-语句,而不是像我在回答中建议的那样立即替换所有的语句?如果我对整个范围使用替换,即使出现AM和PM的第一行也会被替换。。我在同一张表中有两组表格,其中一些单元格包含“-”。
Dim r As Range
Set r = Range("C1:AW200")
r.Replace What:="AM", Replacement:="", LookAt:=xlPart, MatchCase:=False
r.Replace What:="PM", Replacement:="", LookAt:=xlPart, MatchCase:=False
'Remove additional AM and PM
    For m = 100 To 2 Step -1
        For n = 3 To 30
                celltxt = Cells(m - 1, n).Text
                    If celltxt Like "*AM*" Then
                        Cells(m, n).Replace What:="AM", Replacement:=" "
                    Else
                    End If
        Next n
    Next m
    For m = 100 To 2 Step -1
        For n = 3 To 30
                celltxt = Cells(m - 1, n).Text
                    If celltxt Like "*PM*" Then
                        Cells(m, n).Replace What:="PM", Replacement:=" "
                    Else
                    End If
        Next n
    Next m
    For m = 100 To 2 Step -1
        For n = 3 To 30
                celltxt = Cells(m - 1, n).Text
                    If celltxt Like "*-*" Then
                        Cells(m, n).Replace What:="PM", Replacement:=" "
                    Else
                    End If
        Next n
    Next m
    For m = 100 To 2 Step -1
        For n = 3 To 30
                celltxt = Cells(m - 1, n).Text
                    If celltxt Like "*-*" Then
                        Cells(m, n).Replace What:="AM", Replacement:=" "
                    Else
                    End If
        Next n
    Next m
End Sub