| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2422 人关注过本帖, 1 人收藏
标题:值为 函数的字符串 转为 表达式计算,VFP中可用宏替换,EXCEL VBA中如何实现 ...
只看楼主 加入收藏
wasun2012
Rank: 2
等 级:论坛游民
帖 子:12
专家分:17
注 册:2012-11-17
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:6 
值为 函数的字符串 转为 表达式计算,VFP中可用宏替换,EXCEL VBA中如何实现
最近拷贝了一个色值表到EXCEL表,两列数据,A列是 颜色名称,B列是 十六进制色值,共 144 行数据,
图片附件: 游客没有浏览图片的权限,请 登录注册

由于经常用到 RGB值,为便于参考,
1、我打算增加相应的 RGB值 到 C 列
       —— 即根据 B 列的 十六进制色值 转为十进制 RGB  如 #8470FF    RGB(132,112,255),生成在 C 列
2、为更直观,同时增加相应的色块到 D 列
       —— 根据 RGB值 填充 D 列 单元格背景色
图片附件: 游客没有浏览图片的权限,请 登录注册

本来打算直接在 EXCEL VBA中完成的,因为 EXCEL 本身具有转换函数 HEX2DEC ,但解决第 2点时,碰到问题,
如何通过 C列 的字符串 “RGB( r,g,b)”如 "RGB(132,112,255)"转化为 RGB(132,112,255) ,然后赋给 interior.color=RGB(132,112,255)
这在VFP中用宏替换容易解决,但在VBA中如何做到呢,上网找了下,好象要用到 微软的脚本控件 Script.control,难道真要这么费劲吗
我试了下,不成功,最后还是用  VFP 结合 EXCEL 来完成。

程序代码:
#define xlFillDefault  0
#define xlPasteFormats -4122
#define xlNone -4142

LOCAL oExcel as 'Excel.application'
LOCAL nDataRows as Integer 
LOCAL cRange,lcStr as String 

oExcel=Createobject('Excel.application')
oExcel.Workbooks.Open('F:\常用RGB色值表.xlsx')
oExcel.Worksheets("sheet1").Activate
oExcel.Visible=.T.
*oExcel.cells.Hyperlinks.Delete   

oExcel.Range("C1").Select
oExcel.ActiveCell.value = "RGB值"
oExcel.Range("C2").Select
oExcel.ActiveCell.FormulaR1C1 = ;
'=HEX2DEC(MID(RC[-1],2,2))&","&HEX2DEC(MID(RC[-1],4,2))&","&HEX2DEC(MID(RC[-1],6,2))'

nDataRows=oExcel.SHEETS(1).UsedRange.Rows.Count
cRange=["C2:C]+TRANSFORM(nDataRows)+["]
oDestination=oExcel.Range(&cRange)
nType=xlFillDefault
oExcel.Selection.AutoFill(oDestination, nType)

oExcel.Range(&cRange).select 

*!*生成色块列
oExcel.Cells(1,4).value = "色块"
FOR r=2 TO nDataRows
   lcStr='RGB('+oExcel.cells(r,3).value+')'
   oExcel.cells(r,4).interior.color=&lcStr && 
NEXT  
oExcel.Range("B1").select 
oExcel.Selection.Copy
oExcel.Range("D1").Select 
oExcel.Selection.PasteSpecial(xlPasteFormats,xlNone, .F., .F.)
&&格式化标题

*!*最后格式化 RGB值数据列
cRange=["B1:B]+TRANSFORM(nDataRows+1)+["]
oExcel.Range(&cRange).select 
oExcel.Selection.Copy
oExcel.Range("C1").Select
oExcel.Selection.PasteSpecial(xlPasteFormats,xlNone, .F., .F.)
oExcel.columns("C").autofit
oExcel.Application.CutCopyMode=.f.


我的问题是:VFP的宏替换功能, VBA中如何实现?

附转换后的数据表:
常用RGB色值表.rar (14.59 KB)


[ 本帖最后由 wasun2012 于 2013-2-5 11:54 编辑 ]
搜索更多相关主题的帖子: 十六进制 表达式 字符串 
2013-02-05 11:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
VFP可以直接使用十六进制表达式的,在数字前面加0x即可,比如,0x10就是十进制16。
把你B列的字符串(不要#号)赋给一个字符串变量,比如"F0F8FF"这个颜色,赋值为Color="FFF8F0",即颠倒顺序,然后0x&x这个数值,就是对应的RGB值了。

授人以渔,不授人以鱼。
2013-02-05 14:37
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
只要知道真实的色值(一个长整数),就可以通过编程以任何形式显示输出,不管是B列还是C列,究其实就是一个字符串而已。

授人以渔,不授人以鱼。
2013-02-05 15:13
wasun2012
Rank: 2
等 级:论坛游民
帖 子:12
专家分:17
注 册:2012-11-17
收藏
得分:0 
以下是引用TonyDeng在2013-2-5 14:37:22的发言:

VFP可以直接使用十六进制表达式的,在数字前面加0x即可,比如,0x10就是十进制16。
把你B列的字符串(不要#号)赋给一个字符串变量,比如"F0F8FF"这个颜色,赋值为Color="FFF8F0",即颠倒顺序,然后0x&x这个数值,就是对应的RGB值了。


多谢版主,又多学一招
2013-02-05 17:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
试试这个输出什么?

? TRANSFORM(RGB(0xF0, 0xF8, 0xFF), "@0")

授人以渔,不授人以鱼。
2013-02-05 17:30
wasun2012
Rank: 2
等 级:论坛游民
帖 子:12
专家分:17
注 册:2012-11-17
收藏
得分:0 
以下是引用TonyDeng在2013-2-5 17:30:33的发言:

试试这个输出什么?

? TRANSFORM(RGB(0xF0, 0xF8, 0xFF), "@0")


我试了一下,确实如此,
   oExcel.cells(r,3).value=RGB(val('0x'+cRed),val('0x'+cGreen),val('0x'+cBlue)) && RGB 的十进制值 
   oExcel.cells(r,4).interior.color=val('0x'+cBlue+cGreen+cRed) && RGB 的十六进制值


回到原来的问题,VFP的宏替换功能,在VB中如何实现类似的功能呢?  比如 由 "RGB(123,123,123)" 到  RGB(123,123,123)
2013-02-07 17:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
比较少用VBA,不知道有没有更简捷的办法。用代码来做,直接提取字符串中的三个数值,算成长整数就可以了,因为RGB()函数的结果就是那个数值,不必写成函数形式。

授人以渔,不授人以鱼。
2013-02-07 17:46
快速回复:值为 函数的字符串 转为 表达式计算,VFP中可用宏替换,EXCEL VBA中如 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021868 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved