Vba 状态栏中的进度条、空白字符和填充字符的宽度不相等
我正在为Excel状态栏中运行的进度条创建代码。我想用2个矩形来代替我的旧用户表单(这很管用,但我现在更愿意用一种不那个么显眼的方法) 问题:我用来表示“已填充”和“未填充”的字符宽度略有不同,当使用100个字符时,可以看到末尾的百分比随着进度的增加而向右移动 下面是一些工作示例代码,向您展示我的确切意思:Vba 状态栏中的进度条、空白字符和填充字符的宽度不相等,vba,excel,unicode,Vba,Excel,Unicode,我正在为Excel状态栏中运行的进度条创建代码。我想用2个矩形来代替我的旧用户表单(这很管用,但我现在更愿意用一种不那个么显眼的方法) 问题:我用来表示“已填充”和“未填充”的字符宽度略有不同,当使用100个字符时,可以看到末尾的百分比随着进度的增加而向右移动 下面是一些工作示例代码,向您展示我的确切意思: Sub TestNewProgBar() Dim X As Long For X = 1 To 100000 Call NewProgressBar("Testing", X, 10
Sub TestNewProgBar()
Dim X As Long
For X = 1 To 100000
Call NewProgressBar("Testing", X, 100000)
Next
End Sub
Sub NewProgressBar(MyMessage As String, CurrentVal As Long, MaxVal As Long)
Dim FilledIn As Long, NotFilledIn As Long
If CurrentVal >= MaxVal Then
Application.StatusBar = MyMessage & ": Complete"
Else
FilledIn = Round((CurrentVal / MaxVal) * 100, 0)
NotFilledIn = (100 - FilledIn)
Application.StatusBar = MyMessage & ": " & Application.WorksheetFunction.Rept(ChrW(9608), FilledIn) & Application.WorksheetFunction.Rept(ChrW(9620), NotFilledIn) & "| " & FilledIn & "%"
End If
End Sub
运行TestNewProgBar
并查看状态栏
这将是一个选择不同Unicode符号的简单例子,还是这里有我无法控制的力?从U+25A0到U+25FF的Unicode块称为几何形状。其中有一些匹配的黑白形状对,它们将成功地用于进度条实现 在下面的测试代码中,有些对工作,有些不工作!。我个人喜欢最后一个例子(U+25AE和U+25AD配对)
编辑: 为了继续我下面的“旁白”,我做了一些实验,当他/她提供了一个链接到的时候,共产国际发现了一些东西。上述问题与屏幕更新有关。如果状态栏更改时ScreenUpdate设置为false,则ChrW(9608)和ChrW(9620)的字符宽度相同 我不知道为什么,但它确实奏效了。因此,您需要执行以下操作:
Application.Screenupdating = False
'code which changes the status bar
Application.Screenupdating = True
(我先前的评论如下) 我更喜欢这种搭配:
strFilledChar = ChrW(&H2588) 'a black rectangle, "Full Block"
strUnfilledChar = ChrW(&H2584) 'an array of sparse dots, "Light Shade"
或者这个:
strFilledChar = ChrW(&H2588) 'a black rectangle, "Full Block"
strUnfilledChar = ChrW(&H2500) 'a horizontal line, "Block Drawings Light Horizontal"
(顺便提一下,我遇到了与问题中描述的相同的问题,即ChrW(9608)和ChrW(9620)具有不同的宽度-但仅在我的一本工作簿中。在另一本工作簿中,它们具有相同的宽度,因此进度条显示正确。我不知道原因。)。我猜状态栏没有使用固定宽度的字体,因此您必须在正在使用的字体中找到两个宽度相同的字符。
strFilledChar = ChrW(&H2588) 'a black rectangle, "Full Block"
strUnfilledChar = ChrW(&H2500) 'a horizontal line, "Block Drawings Light Horizontal"