如何将所有前导零保留在VBA中的十六进制范围内?

时间:2010-07-06 20:50:53

标签: excel-vba vba excel

我正在尝试扩展一系列十六进制数字。例如,我在列K ... 1880和列L ... 188A我的范围是1880-188A当我扩展范围时,从列M开始我得到1880 1881 1882 1883 1884 1885 1886等等。

从我发布的一个帖子中我复制并更改了VBA脚本以适合我的情况......它有效......但是发现了2个问题。我的所有设备范围都是4位数,我需要保留所有前导零 例如,如果我的范围是0000 - 0005 ....它的错误......将无效 如果我的范围是0001 - 0005那么我得到1 2 3 4 5 ....我想成为0001 0002 0003 0004 0005

任何帮助将不胜感激.. 谢谢,JCam 这是我使用它的脚本......只要我的范围内没有前导零


Sub FillHexNumbers()
Dim cellKValue As Long
Dim cellLValue As Long
Dim diffBetweenKAndL As Long
Dim iCtr As Long

cellKValue = CLng(Format("&h" & Cells(2, 11).Text, "###"))
cellLValue = CLng(Format("&h" & Cells(2, 12).Text, "###"))

diffBetweenKAndL = cellLValue - cellKValue

For iCtr = 0 To diffBetweenKAndL
    Cells(2, 13 + iCtr).Value = Hex(cellKValue + iCtr)
Next
End Sub

5 个答案:

答案 0 :(得分:3)

分析工具包包含在DEC和HEX之间进行转换的功能 - 对于HEX,您可以指定数字位数,例如= DEC2HEX(14,4)给出“000E”。您可以通过“工具/加载项...”启用此包。通过添加包含DEC编号的列并显示HEX等效值,您可以在没有VBA的情况下解决您的任务......

希望有所帮助

答案 1 :(得分:0)

您必须将数据格式化为字符串。你可以用一个非常'0045完成这个。

可能是这样的:
Cells(2, 13 + iCtr).Value = "'" & Hex(cellKValue + iCtr)

答案 2 :(得分:0)

试试这个:

Dim i as Integer 'This is the number you want to format
Dim l as Integer 'The length you want your format in (suppose it's six)
Dim h as String

l = 6
i = 47           'Any integer between 0 and 16,777,215

h = Replace(Space(l - len(hex(i))), " ", "0") & hex(i) 'h = "00002F"

变量 h 将返回格式文本“00002F”。

干杯,

瑞克。

答案 3 :(得分:0)

如果将单元格格式化为文本,然后添加带前导零的十六进制值,它们应保留。

如果您正在处理已丢失其前导零的十六进制值,则可以在文本编辑器中手动修复它们,然后将新单元格格式化为文本,并粘贴值。

或者,您可以通过右键单击这些单元格,选择“设置单元格格式...”,选择“自定义”,然后输入类似" 0000" (如果,比方说,你喜欢填充到四个字符)。这只会影响不具有字母字符的十六进制值。如果输入000A,Excel应保留零并自动将其视为字符串。

答案 4 :(得分:0)

还必须更正单元格格式,这很重要,因为如果格式为“常规”或“数字”,则Excel会删除前导零。纠正此问题的两种方法是:

  1. 用单引号(')前缀您的值

    Cells(2, 13 + iCtr).Value = "'" & ...
    
  2. 强制使用特定格式。

    Cells(2, 13 + iCtr).NumberFormat = "@" ' Text format
    

关于添加前导0的挑战。我为您提供了三种解决方案。

  1. 设置数字格式,使其显示前导0。请注意,如果您确实需要存储值包括前导0,那么这可能不是理想的解决方案。

    Cells(2, 13 + iCtr).NumberFormat = "000000"
    
  2. 使用值为Or的二进制&H10000000,然后使用Mid()Right()除去前导1。这样做的缺点是您的数字不能超过7位数(十六进制)。但是,鉴于Excel 2016中的最大列数为16,384(十六进制4位数字),最大行为1,048,576(十六进制6位数字)。那不是问题。

    ' Using Mid()
    Cells(2, 13 + iCtr).Value = Mid(Hex(&H10000000 Or (cellKValue + iCtr)), 2)
    ' Desired # of digits = # of 0's       ^^^^^^^
    
    ' Using Right()
    Cells(2, 13 + iCtr).Value = Right(Hex(&H10000000 Or (cellKValue + iCtr)), 4)
    ' Desired # of digits                                                     ^
    
  3. 使用String()Len()函数用0来填充值。这样做的缺点是必须将数字转换为十六进制两次,或者创建另一个变量来保存转换后的字符串。

    Cells(2, 13 + iCtr).Value = String(5 - Len(Hex(cellKValue + iCtr)), "0") & Hex(cellKValue + iCtr)
    ' Desired # of digits              ^
    

我个人更喜欢OrMid()方法。它将确保您的原始值包括前导0,并且具有最少的功能/操作(因此执行起来最快)。