【问题标题】:uniqueness of active sheet VBA EXCEL活动表VBA EXCEL的唯一性
【发布时间】:2016-10-11 18:24:30
【问题描述】:

我有一个问题,我有一个基本工作表,行,对于我创建新工作表的每一行,每个新工作表在单元格 A3 中都有我想用作新活动工作表的名称的值。问题从这里开始,因为在 excel 中,工作表的名称只能有 31 个标志,A3 中的一些值由于只切割 31 个标志而重复。例如,我在一张纸上有用于商业和银行的 A3 技术设备,在下一张有用于商业和私人的技术设备。因此,如果我使用 31 个标志,两张纸将具有相同的名称,并且我收到一个错误,即该纸的名称已被使用。在我的循环中,我浏览了 1000 行,并检查了重复问题是否会出现 700 次,因此我正在考虑从左侧切割 28 个数字而不是 31,并添加到名称编号以使每张纸具有唯一名称。部分代码(只是改名的部分):

Dim name As String
Dim i As Integer
Dim number_repeated As Integer
Dim name_signs As Integer

name = ActiveSheet.Range("a3")
name = Left(name, 31)
For i = 1 To Worksheets.Count
If name <> Worksheets(i).Name Then
ActiveSheet.Name = name
Else
name_signs = ActiveSheet.Range("a3")
name_signs = Left(name_signs, 28)
name_signs = name_signs + CStr(number_repeated)
ActiveSheet.Name = name_signs
number_repeated = 1
number_repeated = number_repeated + 1
End If
Next i

【问题讨论】:

  • 为什么不在 A 列有一个隐藏的工作表,在 A 列有真实的页面名称,在 B 列有一个代码,比如说,每个单词的首字母?然后,您只需将工作表命名为代码而不是真实姓名。例如。 Monthly Report Of Something Really Important 作为真实姓名,然后 MROSRI 作为代码(和工作表名称)。然后在您的单元格A3 中,您可以使用VLOOKUP 来获得正确的值。
  • 是否有任何功能可以像您在示例中那样取出第一个字母?或者你知道怎么写吗?我对 VBA 很陌生,但是手动操作 1000 个案例会花费太多时间。
  • 检查我的回答,看看它是否对你有帮助;)
  • 取第一个字母很简单:Left(str,1)。
  • 这个我知道,但它只需要第一个单词的第一个字母。

标签: vba excel


【解决方案1】:

除非我读得太快,否则你会犯一个逻辑错误:一张纸的命名不同意味着不是没有纸以这种方式命名。 您可以使用:

Public Function SheetIsMissing(s$, Optional WB As Workbook) As Boolean
    If WB Is Nothing Then Set WB = ActiveWorkbook
    SheetIsMissing = True
    On Error GoTo theend
    Dim x
    x = WB.Sheets(s).Cells(1, 1)
    SheetIsMissing = False
theend:
End Function

【讨论】:

    【解决方案2】:

    您发布的代码包含一些错误:

    1) nazwa 未声明。推荐:在宏页面的开头写Option Explicit(如果变量没有声明,这将显示一条消息)。

    2) 代码:

    For i = 1 To Worksheets.Count
    If name <> Worksheets(i).Name Then
    ActiveSheet.Name = name
    

    将尝试将每张工作表更改为相同的名称。

    3) number_repeated 永远不会超过 2 的值,因为在每次增加它之前,你都会将它设置回 1。

    也许会这样:

    Sub Macro1()
    For i = 1 To Worksheets.Count
        Worksheets(i).name = Left(Worksheets(i).Range("a3").Value, 28) & " " & i
    Next i
    End Sub
    

    【讨论】:

    • 1. nazwa 我为 name 编辑它是一个错误,3. 我会在循环之前移动 number_repeated。 2. 我将 name = ActiveSheet.Range("a3") name = Left(name, 31) 放在 for 之后但在 if 之前。你怎么看?
    • 我已经编辑了我的消息并添加了一个您可能认可的解决方案。
    【解决方案3】:

    注意:回答评论并避免在 cmets 中出现丑陋的代码)

    以下函数可以获取单元格中存在的给定字符串的首字母,由分隔符(可选,默认值为空格字符)分隔,然后将当前单元格行连接到它。

    Option Explicit
    
    Function getInitials(sht_name As Range, Optional delimiter As String = " ")
    
        Dim sht_desc As String: sht_desc = sht_name.Value
        Dim str_array As Variant
        Dim split_str As Variant
        getInitials = ""
    
        str_array = Split(sht_desc, delimiter)
        For Each split_str In str_array
          getInitials = getInitials & Left(split_str, 1)
        Next
    
        getInitials = getInitials & "_" & sht_name.Row
    
    End Function
    

    使用示例:

    在单元格A3 中写入Monthly Report Of Something Really Important,在B3 中写入=getInitials(A3),返回MROSRI_3

    【讨论】:

    • 谢谢你的功能,但我认为我仍然有最后一个单词有时以同一个字母开头的情况,所以我认为数字的第一个想法更好。
    • @K.L - 新解决方案 ;)
    【解决方案4】:

    我会选择首字母缩略词

    所以这是一个返回字符串首字母缩写词的函数,基于空格(“”)作为单词分隔符:

    Function GetInitials(strng As String) As String
        Dim words As Variant, word As Variant
        words = Split(strng, " ")
        For Each word In words
            GetInitials = GetInitials & Left(word, 1)
        Next word
    End Function
    

    您可以按如下方式使用:

    Option Explicit
    
    Sub main()
        Dim sht As Worksheet
        Dim shtAcronym As String
    
        For Each sht In Worksheets
            shtAcronym = GetInitials(sht.Range("A3")) '<- get the acronym out of the current worksheet "A3" cell
    
            '...
        Next sht
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多