如何为以下示例创建自定义格式、公式或 VBA 代码?

Posted

技术标签:

【中文标题】如何为以下示例创建自定义格式、公式或 VBA 代码?【英文标题】:How do I create a custom format, formula or VBA code for the below examples? 【发布时间】:2021-07-08 17:22:10 【问题描述】:

我在 Excel 中有一个长长的 IP 列表,这些 IP 对某个站点的格式无效。我必须手动更改/重新键入每个文件才能将文件上传到网站。

如何为以下示例创建自定义公式、vba 或格式代码?

左边的IP格式需要是右边的格式。

例子:

123.45.678.0 - 123.45.679.255   should be -->   123.45.678-679.*
123.45.678.9 - 123.45.678.12  should be -->   123.45.678.9-12
a.b.c.d - a.b.e.f   should be -->   a.b.c-e.*       
a.b.c.d - a.b.c.f   should be -->   a.b.c.d-f

当我手动完成一些时,QuickAnalysis 自动填充/快速填充没有激活。换句话说,Excel 并没有为我挑选模式或填充其余部分。

【问题讨论】:

公式在这里不是答案。您需要编写 vba 来执行此操作。 你真的有那些虚线字母串吗?如果是这样,一个段中可以有多个字母吗? 【参考方案1】:

我制作了一个函数,可以将字符串输入转换为您要求的格式。

它使用Split函数来比较IP地址的每个部分从开始和结束范围。

Function ipFormatter(ByVal ipRange As String) As String
    'Skip inputs with no "-"
    If InStr(1, ipRange, "-") = 0 Then
        ipFormatter = ipRange
        Exit Function
    End If
    
    'Removing all spaces
    ipRange = Replace(ipRange, " ", "")
    
    'Splitting the ip addresses into arrays of strings
    Dim ipStart() As String, ipEnd() As String
    ipStart = Split(Split(ipRange, "-")(0), ".")
    ipEnd = Split(Split(ipRange, "-")(1), ".")
    
    Dim ipOut() As String
    ReDim ipOut(UBound(ipStart))
    
    Dim i As Long, setRange As Boolean
    For i = LBound(ipStart) To UBound(ipStart)
        If setRange Then
            'After a range
            ipOut(i) = "*"
        ElseIf ipStart(i) = ipEnd(i) Then
            'Exact Match
            ipOut(i) = ipStart(i)
        Else
            'IP Range found
            ipOut(i) = ipStart(i) & "-" & ipEnd(i)
            setRange = True 'All values after this one will be "*"
        End If
    Next i
    
    ipFormatter = Join(ipOut, ".")
End Function

这里是如何使用该功能的示例

Sub test()
    Const inputstr As String = "123.45.678.0 - 123.45.679.255"
    
    MsgBox ipFormatter(inputstr)
End Sub

Sub example()
    Dim Sht As Worksheet
    Set Sht = ThisWorkbook.Sheets("Sheet1")
    
    Dim lastrow As Long
    lastrow = Sht.Rows(Sht.Rows.Count).Cells(1).End(xlUp).Row
    
    Dim i As Long
    For i = 1 To lastrow
        Sht.Cells(i, 2) = ipFormatter(Sht.Cells(i, 1))
    Next i
End Sub

【讨论】:

如果将其放入代码模块中,您也可以将其用作 Excel 公式中的 UDF。因此,您可以在 Excel 工作表中使用公式 =ipFormatter(A1) 非常感谢您在这里所做的工作。现在全部处理,并会回复您。 我是一个初学者,我不知道把所有东西放在哪里以及要遵循什么步骤。 1. 打开 Visual Basic 。 2.插入-->模块? 3. 在模块中粘贴代码?我应该运行任何东西吗?它应该是一个宏吗?我在带有 IP 的列旁边输入了公式,结果是#NAME?谢谢。 在您的 Excel 工作簿中,按 Alt+F11 打开 VB 项目窗口。然后按Ctrl+R 打开项目资源管理器,它应显示为窗口左侧的一列。在 Project Explorer 中单击鼠标右键并转到 Insert > Module。双击该新模块,其名称应类似于Module1。将我的函数复制并粘贴到主窗口中。完毕!无需运行任何东西。您可以在 Excel 公式中使用它,与 SUMCOUNT 相同。 @Lauren Getting #NAME 意味着该函数不在公共代码模块中,或者键入的名称与任何已知的函数名称不匹配。我怀疑您可能已将代码复制并粘贴到工作表代码模块或工作簿的代码模块中。它需要位于与工作表或工作簿无关的模块中,例如在您执行Insert > Module 时创建的模块。仔细检查代码是否在正确的位置。

以上是关于如何为以下示例创建自定义格式、公式或 VBA 代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Cloudwatch 创建自定义文本格式化程序?

如何为自定义帖子创建单个模板

如何为 QtCreator 创建自定义主题

如何为 Qt 创建自定义小部件

如何为自定义 CPU 创建 C 编译器?

ASP.NET:如何为 GridView 创建自定义分页器?