add a“:”如果该领域没有结肠

问题描述 投票:0回答:2
我希望用户在VBA应用程序中,带有结肠或没有结肠的文本字段中输入时间,文本最终都带有colon。

一些例子是1000、10:00、0856、08:56、2100和23:56.

如果他们进入1234,则将其更改为12:34。

如果他们进入15:36,请停留为15:36.

输入文本时,将使用该文本更新Excel中的单元格。 Excel中的以下公式给了我我想要的东西,但是我希望从VBA完成此操作,因此我不必在代码中找到该单元格的每个实例并将其更新为其他。

=IF(COUNTIF(B2, "*" & ":" & "*"), B2, REPLACE(B2,LEN(B2)-1,0,":"))

我在VBA中尝试了类似的东西,但是当我尝试输入它时,有红色文本:
'Worksheets("Sheet1").Range("B2").Formula = "=IF(COUNTIF(B2, "*" & ":" & "*"), B2, REPLACE(B2,LEN(B2)-1,0,":"))"

在格式为文本
excel vba replace countif
2个回答
0
投票

因此,您想使用公式(即更正用户输入的内容)做一些无法完成的操作。

在这种情况下,要纠正的数据在列
    B
  • 中,从
  • B2
  • 单元)开始,然后继续到最后一个非空行(
    Singlecolumn
    )。
    
    I编写了代码,因此您可以轻松地修改每种情况的行为。一旦您弄清楚每种情况到底应该发生什么,就可以改进(提出另一个问题)。
标准模块,例如

Module1enter image description hereVBE-->Insert-->Module

单元

Sub CorrectTimeSingleCell()
    
    ' Read.
    
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    Dim ws As Worksheet: Set ws = wb.Sheets("Sheet1")
    Dim cell As Range: Set cell = ws.Range("B2")
    Dim rStr As String: rStr = CStr(cell.Value)
    
    ' Modify.
    
    If InStr(rStr, ":") = 0 Then ' doesn't contain a colon
        Select Case Len(rStr)
            Case 0
                rStr = "00:00"
            Case 1
                rStr = "00:0" & rStr
            Case 2
                rStr = "00:" & rStr
            Case 3
                rStr = "0" & Left(rStr, 1) & ":" & Right(rStr, 2)
            Case 4
                rStr = Left(rStr, 2) & ":" & Right(rStr, 2)
            Case Else
                rStr = Mid(rStr, 1, Len(rStr) - 2) & ":" & Right(rStr, 2)
        End Select
    Else ' contains a colon
        ' do nothing?
    End If
    
    ' Write.
    
    cell.Value = rStr
    
    ' Inform.
    
    MsgBox "Time corrected.", vbInformation
    
End Sub
单列

Sub CorrectTime() ' Define constants. Const TOP_CELL_ADDRESS As String = "B2" ' Read. Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code Dim ws As Worksheet: Set ws = wb.Sheets("Sheet1") Dim rg As Range, RowsCount As Long With ws.Range(TOP_CELL_ADDRESS) RowsCount = ws.Cells(ws.Rows.Count, .Column).End(xlUp).Row - .Row + 1 If RowsCount < 1 Then Exit Sub ' no data Set rg = .Resize(RowsCount) End With Dim Data() As Variant If RowsCount = 1 Then ReDim Data(1 To 1, 1 To 1): Data(1, 1) = rg.Value Else Data = rg.Value End If ' Modify. Dim r As Long, rStr As String For r = 1 To RowsCount rStr = CStr(Data(r, 1)) If InStr(rStr, ":") = 0 Then ' doesn't contain a colon Select Case Len(rStr) Case 0 rStr = "00:00" Case 1 rStr = "00:0" & rStr Case 2 rStr = "00:" & rStr Case 3 rStr = "0" & Left(rStr, 1) & ":" & Right(rStr, 2) Case 4 rStr = Left(rStr, 2) & ":" & Right(rStr, 2) Case Else rStr = Mid(rStr, 1, Len(rStr) - 2) & ":" & Right(rStr, 2) End Select Data(r, 1) = rStr Else ' contains a colon ' do nothing!? End If Next r ' Write. rg.Value = Data ' Inform. MsgBox "Times corrected.", vbInformation End Sub

公式中间的引号是问题。  要出现在公式中的引号,您需要使用一对(“”)。
您在VBA中输入的公式也将在单元格B2上创建一个圆形参考。  如果您在单元格中输入的公式会给您想要的结果,请尝试:

Worksheets("Sheet1").Range("A2").Formula = "=IF(COUNTIF(B2,""*"" & "":"" & ""*""), B2, REPLACE(B2,LEN(B2)-1,0,"":""))"

0
投票

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.