在VBA中搜索并返回粗体值

时间:2016-07-27 05:46:56

标签: excel vba excel-vba

我知道这可能不是最理想的做法,而只是忍受我。

我有一个包含几张桌子的文件。我正在使用userform搜索表/子类别并返回相关值。我想在用户窗体上选择带有一系列选项按钮的子类别,这些按钮将依次设置搜索功能的范围。如果要添加新表或沿着这些行添加任何内容,我还想动态更新选项按钮。

区分子类别/表的标题及其中的项目的唯一方面是子类别/表的标题是粗体。所以我要做的是搜索电子表格的第一列,并以粗体返回任何条目的名称。然后使用这些值来设置选项按钮的名称:)。

以下函数是我尝试在列a中查找以粗体显示的文本实体,返回它们并将每个实体设置为要在另一个函数中使用的单个变量。 bold1 ....变量都是全局定义的变量,因为我需要它们在另一个子变量中,page变量包含要使用的相关页面。目前代码返回一个错误,指出“变量或未设置块”,并使用调试器,我可以看到bold1 ....并且所有其他boldx变量都没有设置值。有谁知道发生了什么/如何解决这个问题。

提前致谢:)

Sub SelectBold()
    Dim Bcell As Range
    For Each Bcell In Worksheets(Page).Range("A1:A500")
        If Bcell.Font.Bold = True Then
            Set bold1 = Bcell
        End If
    Next
End Sub
编辑:我简化了上面的功能,以消除混乱并帮助缩小问题范围。我希望上面的函数在变量bold1

中存储找到的单元格的内容(文档中的任何单元格,在此阶段以粗体显示)

2 个答案:

答案 0 :(得分:0)

这将返回页面A列中粗体单元格的值数组。

您可以使用列表属性填充包含这些值的组合框或列表框。

  

ComboBox1.List = getSubCategories(“Sheet1”)

Function getSubCategories(Page As String) As String()

    Dim arrSubCategories() As String
    Dim count As Long
    Dim c As Range

    With Worksheets(Page)
        For Each c In .Range("A2", .Range("A" & Rows.count).End(xlUp))
            If c.Font.Bold Then
                ReDim Preserve arrSubCategories(count)
                arrSubCategories(count) = c.Value
                count = count + 1
            End If
        Next
    End With

    getSubCategories = arrSubCategories
End Function

答案 1 :(得分:0)

您可能会发现在找到子类别单元格时返回Range非常有用:

Function SelectBold(Page As String, colIndex As String) As Range
    With Worksheets(Page)
        With .Range(colIndex & "1", .Cells(.Rows.Count, colIndex).End(xlUp)).Offset(, .UsedRange.Columns.Count)
            .FormulaR1C1 = "=if(isbold(RC[-1]),"""",1)"
            .Value = .Value
            If WorksheetFunction.CountA(.Cells) < .Rows.Count Then Set SelectBold = Intersect(.SpecialCells(xlCellTypeBlanks).EntireRow, .Parent.Columns(1))
            .Clear
        End With
    End With
End Function

Function IsBold(rCell As Range)
    IsBold = rCell.Font.Bold
End Function

可能被利用如下:

Option Explicit

Sub main()
    Dim subCategoriesRng As Range, cell As Range

    Set subCategoriesRng = SelectBold(Worksheets("bolds").Name, "A") '<--| pass worksheet name and column to search in

    If Not subCategoriesRng Is Nothing Then
        For Each cell In subCategoriesRng '<--| loop through subcategories cells
            '... code
        Next cell
    End If
End Sub