以编程方式访问 VBA 设置字体/大小不起作用

Posted

技术标签:

【中文标题】以编程方式访问 VBA 设置字体/大小不起作用【英文标题】:Access VBA programmatically setting font/size not working 【发布时间】:2014-08-22 20:22:50 【问题描述】:

我有一个按钮,可以将文本框的字体和大小更改为 Tahoma 8pt。按钮事件是:

Private Sub btnSetFont_Click()
    MsgBox ("Setting Inventory Description to Tahoma 8pt")
    Me.InventoryDescription.FontSize = 8
    Me.InventoryDescription.FontName = "Tahoma"
End Sub

不幸的是,文本没有改变。我正在测试它,首先手动编辑字体和大小,然后按下我的按钮。

但是,如果我执行以下操作,

Private Sub btnSetFont_Click()
    MsgBox ("Setting Inventory Description to Tahoma 8pt")
    Me.InventoryDescription.Value = "hello"
    Me.InventoryDescription.FontSize = 24
    Me.InventoryDescription.FontName = "Times"
End Sub

文本当然会变成“hello”,但字体和大小确实会发生变化。 (我使用 Times 24pt,因为文本框的默认值是 Tahoma 8pt,我想确保它不只是恢复到默认值)这让我认为文本框需要有焦点才能进行更改。所以,我尝试了:

Private Sub btnSetFont_Click()
    MsgBox ("Setting Inventory Description to Tahoma 8pt")
    Me.InventoryDescription.SetFocus
    Me.InventoryDescription.FontSize = 24
    Me.InventoryDescription.FontName = "Times"
End Sub

但是,不行。

Soooo,我做错了什么?


我发现了问题的一个方面。文本框 .TextFormat 设置为 Rich Text。如果我将其更改为纯文本,则按钮效果有效。但是,将其设置为富文本的原因是允许斜体。因此,我尝试先将其设置为纯文本,然后更改字体/大小,但这也不起作用。

【问题讨论】:

你说改变值确实有效,为什么不试试Me.InventoryDescription.Value = Me.InventoryDescription.Value 有趣。我已经尝试过了(使用虚拟变量除外),但不行。而且直接方法也不起作用:( 【参考方案1】:

我有同样的需求:我希望用户能够使用粗体、斜体和下划线字符来格式化文本,但我不想允许更改字体名称或更改字体大小。并且复制/粘贴操作通常会在我的 textBox 中导入格式化文本,这需要“清理”。

我找到的解决方案在下面的函数中。 此函数应由事件过程调用(即更新后或单击时)。


Public Function CleanRichText(strTEXT, strFont, nSize)
'*****************************************************
' 

    For i = 1 To 9
        strTEXT = Replace(strTEXT, "size=" & i, "size=" & nSize)
    Next i

    strTEXT = Replace(strTEXT, "font face", "font_face")
    strTEXT = Replace(strTEXT, "font" & Chr(13) & Chr(10) & "face", "font_face")

    Do While InStr(1, strTEXT, "font_face=" & Chr(34)) > 0
        iCut1 = InStr(1, strTEXT, "font_face=" & Chr(34))
        iCut2 = InStr(iCut1 + 12, strTEXT, Chr(34))
        strLeft = Left(strTEXT, iCut1 - 1) & "font_face=Face"
        strRight = Right(strTEXT, Len(strTEXT) - iCut2)
        strTEXT = strLeft & strRight
    Loop

    Do While InStr(1, strTEXT, "font_face=") > 0
        iCut1 = InStr(1, strTEXT, "font_face=")
        iCut2 = InStr(iCut1 + 12, strTEXT, Chr(32))
        strLeft = Left(strTEXT, iCut1 - 1) & "font face=" & strFont & Chr(32)
        strRight = Right(strTEXT, Len(strTEXT) - iCut2)
        strTEXT = strLeft & strRight
    Loop
    CleanRichText = strTEXT

End Function

Private Sub Cause_AfterUpdate()

    Me.Cause = CleanRichText(Me.Cause, Me.Cause.FontName, 2)
End Sub

【讨论】:

【参考方案2】:

您的代码对我有用。更改字体后尝试添加Me.Repaint

【讨论】:

嗯。那没有帮助。我仍在使用 Access 2010。 你说时代有效,但不是托霍马?你确定你安装了 Tohoma 吗? 文本框的字体属性是 Tahoma 8pt。如果我打开表格并开始输入,它是 Tahoma 8pt。有时我想从另一个来源剪切和粘贴,所以我希望能够将字体设置回 Tahoma。但是,我只想要字体编辑能力,所以我可以有粗体和斜体。它是一种供图书馆使用的表格。另外,如果我使用 Tahoma 8pt 而不是 Times 24pt,当我将文本更改为“hello”时,我会得到 Tahoma 8pt。我使用了不同的字体来确保我确实在设置它,而不是让它恢复为默认值。我想有很多东西需要解释。 抱歉,我无法复制您的问题。 这是否意味着您的字体/大小会发生变化?我将文本框设置为富文本。当我打开表单时,我在文本框中输入一些内容,选择它,然后设置字体/大小。然后我按下按钮。这就是你正在做的事情并且格式改变了吗?【参考方案3】:

您的代码使用 Access 2010 为我工作。

我将此代码添加到几个命令按钮的单击事件中,这些命令按钮允许用户动态控制名为教师列表的列表框中的字体大小。

Private Sub cmdDecreaseFont_Click()
     Me.teachersList.FontSize = Me.teachersList.FontSize - 1
End Sub

Private Sub cmdIncreaseFont_Click()
    Me.teachersList.FontSize = Me.teachersList.FontSize + 1
End Sub

然后在表单中添加了几个简单的命令按钮

【讨论】:

【参考方案4】:

我开始使用@yves 解决方案,但是当“字体”标签包含“大小”属性时它会失败,例如:

<font face="Arial" size="5">a colour in it will break?</font>

所以我找到了使用#RegExp 的更好方法,你可以关注这个论坛的帖子:accessforums.net

Public Function CleanRichTextRegEx(ByVal strText As String, _
                               ByVal strFont As String, _
                               ByVal nSize As Integer) As String
    Dim objRegEx As Object
    Set objRegEx = CreateObject("VBScript.RegExp")
    On Error Resume Next
    With objRegEx
       .Global = True
       'Replace font size
       .Pattern = "size=[0-9]"
       strText = .Replace(strText, " size=" & nSize)
       'Replace font face
       .Pattern = "face=([""'])(?:[\r\n]*(?=(\\?))\2.)*?\1"
       strText = .Replace(strText, "face=" & strFont)
    End With
    Set objRegEx = Nothing
    CleanRichTextRegEx = strText
End Function

你可以这样使用它:

richText = "<font face='Arial' size='5'>a colour in it will break?</font>" 
richTextResult = CleanRichTextRegEx(richText, "Arial", 2)

【讨论】:

以上是关于以编程方式访问 VBA 设置字体/大小不起作用的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式设置边距不起作用

以编程方式设置Segoe UI Symbol字体

设置响应式字体大小在革命滑块jQuery插件中不起作用

以编程方式为 NativeScript Vue 中的标签设置“跨度”颜色在 FormattedString 中不起作用

更改 uibutton 的文本大小不起作用

以编程方式添加约束不起作用