Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 4632|回复: 10

VBA中的&还有其他作用?

[复制链接]
发表于 2019-10-24 14:00 | 显示全部楼层 |阅读模式

当在代码窗口中写下类似“&256”的代码(&后面跟一个数字,之间没有空格)。输入后,VBE会自动将代码改写为“&O256”,自动在数字前面加一个字母“O”(并不是所有数字都可以),并且这部分表达式本身也有返回值,如下图:
QQ截图20191024135058.jpg
&O256返回的值是174,那&在这里扮演什么角色,作用是什么呢?有谁能帮忙解解惑吗?
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2019-10-24 14:27 | 显示全部楼层
就是字符连接,没别的。
不管连接的是数字、字符、时间,一律当成字符看待;
回复

使用道具 举报

发表于 2019-10-24 15:22 | 显示全部楼层
此处表示 8进制

单元格中输入
=OCT2DEC(256)
回复

使用道具 举报

 楼主| 发表于 2019-10-24 15:55 | 显示全部楼层
hfwufanhf2006 发表于 2019-10-24 14:27
就是字符连接,没别的。
不管连接的是数字、字符、时间,一律当成字符看待;

可是输入“&1"后为什么会自动变为"&O1"?这是什么和什么连接?
回复

使用道具 举报

 楼主| 发表于 2019-10-24 15:58 | 显示全部楼层
本帖最后由 影子123 于 2019-10-24 16:01 编辑
砂海 发表于 2019-10-24 15:22
此处表示 8进制

单元格中输入

难道&与数字组合是十转八的计算?
回复

使用道具 举报

发表于 2019-10-24 16:41 | 显示全部楼层
本帖最后由 砂海 于 2019-10-24 17:02 编辑

&数字      & 表示8进制
& 数字     & 为连接符
.
.
有无空格的区别 .

.
.
&h11    中  &h 表示16进制


回复

使用道具 举报

发表于 2019-10-24 17:19 | 显示全部楼层
本帖最后由 爱疯 于 2019-10-24 17:29 编辑

1)从结果看,&数字,是8进制转10进制
   如果数字包含8或9,则变红(是不是叫无法编译),应该是因为8进制里没有8和9


2)比如,第1句不报错,第2句报错
   MsgBox &11112222333
   MsgBox &111122223333
   说明当数字足够大时也会报错,那多大会出错,我没找到帮助


3)没有2进制转10进制的。为什么8和16都有,2却没有,没保持队形啊,不公平
Sub test()
    'msgbox &B11
    MsgBox &O11    '返回9
    MsgBox &H11    '返回17
End Sub
回复

使用道具 举报

发表于 2019-10-24 23:04 | 显示全部楼层
本帖最后由 rardge2015 于 2019-10-24 23:07 编辑
爱疯 发表于 2019-10-24 17:19
1)从结果看,&数字,是8进制转10进制
   如果数字包含8或9,则变红(是不是叫无法编译),应该是因为8进 ...

超出 Long 型变量的上限,就会出错。Long 型变量占用 4 个Byte,1 Byte = 8 Bit,共 32 Bit,其中第 1 个 Bit 用作符号位(+/-),所以能容纳的最大数量就是 2^31 = 2147483648,因为从 0 开始计数,所以最大是 2147483647。超过这个值,VBA  就溢出了。
十六进制需要 4 Bit,所以,31 Bit 可以表示成 3 Bit + 7 × 4 Bit。3 Bit 最大值是 7,4 Bit 最大值是 F,所以最大值是 &H7FFFFFFF(1个7,7个F)。
同理,八进制需要 3 Bit,31 Bit = 1 Bit + 10 × 3 Bit,最大值就是 &O17777777777(1个1,10个7)。
  1. MsgBox &O17777777777
  2. MsgBox &O17777777777 + 1
复制代码
可以用上述代码测试溢出。

如果突破了十六进制的第一个 7,比如改为 8 或者 F 之间任何一个数,会变成负数,因为第 1 个 Bit 置 1 了。
当第 1 个 Bit 符号位置 1,后 31 个 Bit 全部置 0 是负数最小值。如果再减 1,则第一个符号位被借位(四则运算规则),结果反而成了正数,所以必须当作溢出处理了。在纸上用二进制来演示一下计算过程就能理解了。
八进制同理。
  1. MsgBox &H80000000
  2. MsgBox &H80000000 - 1
复制代码
上述代码测试负数溢出。

回复

使用道具 举报

发表于 2019-10-24 23:20 | 显示全部楼层
本帖最后由 rardge2015 于 2019-10-24 23:22 编辑

& 还可以表示 Long 型。
  1. Dim x As Long
  2. Dim x&
复制代码
这两个声明是一样的。
第二行,是为了兼容以前的老代码而保留,看起来确实简练,但建议还是使用第一行的声明方式。
因为不是所有变量类型都有符号,一共只有 6 个:%,&,!,#,@,$。
如果在代码中英文和 & 之间没有空格,会把这个英文字母或单词解释为 Long 型变量,但一般都会因为语法错误而在编写的时候直接被 VBE 识别出来。
回复

使用道具 举报

 楼主| 发表于 2019-10-25 10:39 | 显示全部楼层
感谢大家的回复,受益匪浅
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-3-29 23:47 , Processed in 0.806432 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表