TZ_in_Markierung_Pruefen

2023-10-14  本文已影响0人  极客Geek
Option Explicit

Public Sub TZ_in_Markierung_Pruefen()
'关闭屏幕更新2023.10.16
Application.ScreenUpdating = False

'这段VBA代码定义了一个名为TZ_in_Markierung_Pruefen的公共子程序。
'该子程序的主要功能是检查选定区域中的单元格值是否满足特定条件(长度小于等于14),如果满足条件,则调用TZ_Pruefen函数对单元格值进行处理。
'处理后的值将替换原来的值,并在需要时添加注释。最后,代码将选定区域的格式设置为数字格式,并调整水平对齐方式。
'如果没有选择任何区域,将弹出一个消息框提示用户。如果在执行过程中发生错误,将弹出一个包含错误描述的消息框,并继续执行后续操作。
Dim gesM As Range
Dim neuerWert As Variant
Dim i As Long

On Error GoTo Err_TZ_in_Markierung_Pruefen
Application.Cursor = xlWait '沙漏
If Not IsNull(Application.Selection) Then
    Set gesM = Application.Selection
    For i = 1 To gesM.Cells.Count
        If Len(Trim(gesM.Cells(i).Value)) <= 18 Then
        '将14改为18 2023.10.16
        
          neuerWert = TZ_Pruefen(gesM.Cells(i).Value)
          If Len(neuerWert) <> 14 Then
              '无
          Else
            If Trim(gesM.Cells(i).Value) <> neuerWert Then
               '评论中的原始值
               If gesM.Cells(i).Comment Is Nothing Then
                  gesM.Cells(i).AddComment "原始值: " & gesM.Cells(i).Value
                  gesM.Cells(i).Value = neuerWert
               Else                                   '可发表评论
                  gesM.Cells(i).Value = neuerWert
               End If
            End If
          End If
        End If
    Next i
    gesM.Select
    '以数字格式 "0 "重新设置选定单元格的格式,使长文本不以指数符号显示
    gesM.NumberFormatLocal = "0" '数字格式
    gesM.HorizontalAlignment = xlLeft '对齐 林斯本迪格
Else
    MsgBox "Keine Markierung vorhanden! - Funktion kann nicht ausgefuehrt werden!"
End If
Exit_TZ_In_Markierung_Pruefen:
   Application.Cursor = xlDefault
Exit Sub
Err_TZ_in_Markierung_Pruefen:
   MsgBox Err.Description
   Resume Exit_TZ_In_Markierung_Pruefen
      '恢复屏幕更新 2023.10.16
Application.ScreenUpdating = True
End Sub
Private Function TZ_Pruefen(vTeilzeichen As Variant) As Variant
'这是一个VBA函数,名为TZ_Pruefen,它接受一个参数vTeilzeichen。这个函数的主要目的是将指定的字符串转换为Eickhoff子串格式。以下是该函数的详细解释和代码:

'首先,函数声明了一些变量,如Nr、ZeichLiVonNr、ZeichLiVonNr、ZeichReVonNr$等,用于存储中间结果。
'然后,函数使用UCase和Trim函数对输入的字符串vTeilzeichen进行处理,删除空格并转换为大写。
'接下来,函数检查vTeilzeichen的第一个字符是否有效。如果无效,则返回原始字符串。
'函数继续处理字符串,将其分割成数据包。这里使用了两个循环,第一个循环用于遍历字符串中的每个字符,第二个循环用于处理数字部分。
'如果数字部分的长度大于6位或字母部分的长度大于4位,则返回原始字符串。
'接下来,函数处理索引部分。根据索引中字符的类型(X、Y、Z、W、U),更新sIndex和sIndexNr$变量。
'最后,函数将处理后的结果拼接成一个字符串,并返回。如果结果长度不等于14位,则返回原始字符串。

' 将指定字符串转换为 Eickhoff 子串格式
'2004-02-28 ---------------------------------------------------------
'复制自 gearbox2000DV2-01V1-0 功能 "NCR_TZ
'将指数改为 G
'-------------------------------
'最后更新: 2006-11-27
'重新命名和更改 Excel 函数
'---------------------------------------------------------------------

    On Error GoTo Err_NCR_TZ
    '------------------------------------------------------------------------------
    'Dim EickhoffTZ$
    Dim Nr$
    Dim ZeichLiVonNr$, ZeichReVonNr$
    Dim i As Integer
    Dim sIndex$, sIndexNr$
    Dim Buchstabe$
    Dim Nr_Laenge%
    Dim vTeilzeichen_original As Variant '截至 2006-11-27

    
    vTeilzeichen_original = vTeilzeichen
    
    vTeilzeichen = UCase(Trim(vTeilzeichen)) '删除空格 删除开始/结束
    '不要删除空格,否则将无法识别所附索引
    
    '------------------1 检查 vSubcharacter 中的字符是否有效
    '2006-11-27 新
       'vTeilzeichen = WorksheetFunction.Trim(Replace(Replace(vTeilzeichen, ChrW(160), " "), ChrW(12288), " "))
    vTeilzeichen = Application.Trim(Replace(Replace(vTeilzeichen, ChrW(160), " "), ChrW(12288), " "))
    
      '2023-10-15 新 去除不间断空格和全角空格,删除中间
    Select Case Left(vTeilzeichen, 1)
        Case "C", "F", "G", "L", "N", "R", "S", "V"
            'o.K.
            '取消"B",增加"V"   2023.10.16
            
        Case Else
            TZ_Pruefen = vTeilzeichen_original
            GoTo Exit_NCR_TZ 'Ende
    End Select
    '-------------------------------------------------------------------------
    'String in Pakete aufteilen 将字符串分割成数据包
    'ZeichLiVonNr$, Nr$, ZeichReVonNr$
    '启动
    Nr$ = ""
    Nr_Laenge% = 0
    '-------------------------------------------------------------------------
    'Nr 未格式化
    For i = 1 To Len(vTeilzeichen)
        Buchstabe$ = Mid$(vTeilzeichen, i, 1)
            If Not IsNumeric(Buchstabe$) And Nr_Laenge% = 0 Then
                ZeichLiVonNr$ = ZeichLiVonNr$ & Buchstabe$
            ElseIf Not IsNumeric(Buchstabe$) And Nr_Laenge% > 0 Then
                ZeichReVonNr$ = Right$(vTeilzeichen, Len(vTeilzeichen) - (Len(ZeichLiVonNr$) + Len(Nr$)))
                Nr_Laenge% = -1
            ElseIf IsNumeric(Buchstabe$) And Nr_Laenge% >= 0 Then
                Nr$ = Nr$ & Buchstabe$
                Nr_Laenge% = Nr_Laenge% + 1
            End If
    Next i
    '------------------------------------------------------------------------------
    If Len(Nr$) > 6 Then ' 6 位数字 - 输出零字符串
        TZ_Pruefen = vTeilzeichen_original
        GoTo Exit_NCR_TZ '结束
    End If
    If Len(ZeichLiVonNr) > 4 Then
        TZ_Pruefen = vTeilzeichen_original
    End If
    
    '----------------- 索引中有 1 个字符 ---------------------------
Buchstabe$ = ""
Zeichen_1:
    Buchstabe$ = Mid$(UCase(ZeichReVonNr), 1, 1)
    If InStr("XYZWU", UCase(Buchstabe$)) > 0 Then
        sIndex = Mid$(ZeichReVonNr, 1, 1)
        GoTo Zeichen_2
    End If
    '删除空格
    If InStr(Space$(1), Buchstabe$) > 0 Then
       ZeichReVonNr = Mid$(ZeichReVonNr, 2)
       GoTo Zeichen_1
    End If
    If InStr("/-.\", Buchstabe$) > 0 Then
        ZeichReVonNr = Mid$(ZeichReVonNr, 2)
        GoTo Zeichen_1
    End If
    
    '移动索引 A
    If InStr("ABCDEFGHIJK", Buchstabe$) > 0 Then
        ZeichReVonNr = Space$(1) & ZeichReVonNr
        sIndex = Space$(1)
    End If
    
    '------------- 索引中有 2 个字符  --------------------------------
Zeichen_2:
    '28.02.2004 将指数改为 G
    Buchstabe$ = Mid$(UCase(ZeichReVonNr), 2, 1)
    If InStr("ABCDEFGHIJK", UCase(Buchstabe$)) > 0 Then
        If Len(sIndex) = 0 Then
            sIndex = Space(1) & Mid$(ZeichReVonNr, 2, 1)
        Else
            sIndex = sIndex & Mid$(ZeichReVonNr, 2, 1)
        End If
        GoTo Zeichen_3
    End If
    '删除空格
    If InStr(Space$(1), Buchstabe$) > 0 Then
       ZeichReVonNr = Mid$(ZeichReVonNr, 2)
       GoTo Zeichen_2
    End If
    If InStr("/-.", Mid(ZeichReVonNr, 2, 1)) > 0 Then
        ZeichReVonNr = Mid$(ZeichReVonNr, 2)
        GoTo Zeichen_2
    End If
'交换索引
Zeichen_3:
    If Len(ZeichReVonNr) >= 3 Then
        If InStr("XYZWU", Mid$(UCase(ZeichReVonNr), 3, 1)) > 0 Then
            sIndex = Mid$(ZeichReVonNr, 3, 1) & Trim(sIndex)
            GoTo Index_Ende
        Else
            GoTo Index_Ende
        End If
    End If
'--------------------------------------------------------------------
'IndexNr --------------------------
Index_Ende:
    If IsNumeric(Right$(ZeichReVonNr, 1)) Then '没有添加
        sIndexNr$ = Right$(ZeichReVonNr, 2)
        '如果只指定 1 个数字,则隔离编号
        sIndexNr$ = str(ESLIB_Val_aus_String(sIndexNr$))
        If IsNumeric(sIndexNr$) Then
            sIndexNr$ = Format$(sIndexNr$, "00")
        End If
    Else
        sIndexNr$ = "00"
    End If

    If Len(sIndex) = 0 Then
        sIndex = Space$(2) & sIndexNr$
    ElseIf Len(sIndex) = 1 Then
        sIndex = sIndex & Space$(1) & sIndexNr$
    ElseIf Len(sIndex) = 2 Then
        sIndex = sIndex & sIndexNr$
    Else
        sIndex = sIndex & "!!!!!!!!!!!"
    End If
    '-----------------------------------------------------------------
    
    TZ_Pruefen = UCase(ZeichLiVonNr$ & Space$(4 - Len(ZeichLiVonNr)) & Format$(Nr, "000000") & sIndex)
    
    If Len(TZ_Pruefen) <> 14 Then
        TZ_Pruefen = vTeilzeichen_original
    End If
    If IsNumeric(TZ_Pruefen) Then
      TZ_Pruefen = "'" & TZ_Pruefen
    End If
Exit_NCR_TZ:
    Exit Function

Err_NCR_TZ:
    TZ_Pruefen = vTeilzeichen_original '原稿
    'MsgBox Err.描述
    Resume Exit_NCR_TZ
End Function

Public Function ESLIB_Val_aus_String(ByVal strZahl As String) As Double
    
'这段VBA代码定义了一个名为ESLIB_Val_aus_String的公共函数,该函数接受一个字符串参数strZahl,并返回一个双精度浮点数。
'函数的主要目的是从输入的字符串中提取第一个数字,并将其转换为双精度浮点数。
'在处理过程中,函数会将字符串中的点(".")替换为逗号(","),然后将字符串转换为双精度浮点数。
'如果找不到任何数字,函数将返回0。

'截至 2004-02-28
'隔离从字符串中找到的第一个数字,无论它出现在字符串的哪个位置。
'在这里,一个点被转换为逗号,然后字符串被转换为双数
'类似于 Val 只允许用". "作为逗号,逗号会被忽略,只有
'输出数字的整数部分
'----------------------------------------------------------------------------------------
Dim i As Integer
Dim Nr As Double
Dim strNr$
Dim Buchstabe$
Dim Zahl_gefunden As Boolean


Zahl_gefunden = False
For i = 1 To Len(strZahl)
    Buchstabe$ = Mid$(strZahl, i, 1)
    If IsNumeric(Buchstabe$) Then
        strNr$ = strNr$ & Buchstabe$
        Zahl_gefunden = True
    Else
        '在这里,您必须检查 97 是否接受逗号,还是只接受句号。
        '2000 不接受点作为逗号
        'If Zahl_gefunden = True And (Buchstabe$ = ",") Then
        '如果 Number_found = True 并且 (Letter$ = ",") 然后
        '    strNr$ = strNr$ & Buchstabe$
        If Zahl_gefunden = True And Buchstabe = "." Then
            strNr$ = strNr$ & ","
        Else
            If Zahl_gefunden = True Then
                i = Len(strZahl) + 1
            End If
        End If
    End If
Next i
If Len(strNr$) > 0 Then

    ESLIB_Val_aus_String = CDbl(strNr$)
Else
    ESLIB_Val_aus_String = 0
End If
End Function



'Callback for customButton onAction
Public Sub cBAction1(control As IRibbonControl)
Call TZ_in_Markierung_Pruefen
End Sub


编译错误:
要在64位系统上使用,请检查并更新Declare 语句

将错误处的 “Declare”替换成“Declare PtrSafe” 即可

编译错误:
子过程或函数未定义

ESLIB_Val_aus_String







        If Len(Trim(gesM.Cells(i).Value)) <= 18 Then
        '将14改为18 2023.10.16

 vTeilzeichen = Application.Trim(Replace(Replace(vTeilzeichen, ChrW(160), " "), ChrW(12288), " "))
    
      '2023-10-15 新 去除不间断空格和全角空格,删除中间



        Case "C", "F", "G", "L", "N", "R", "S", "V"
            'o.K.
            '取消"B",增加"V"   2023.10.16
上一篇下一篇

猜你喜欢

热点阅读