Vba 状态栏中的进度条、空白字符和填充字符的宽度不相等

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

我正在为Excel状态栏中运行的进度条创建代码。我想用2个矩形来代替我的旧用户表单(这很管用,但我现在更愿意用一种不那个么显眼的方法)

问题:我用来表示“已填充”和“未填充”的字符宽度略有不同,当使用100个字符时,可以看到末尾的百分比随着进度的增加而向右移动

下面是一些工作示例代码,向您展示我的确切意思:

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"