EXCEL中如何求得单元格所在列的标题字母
用上OFFICE2007后,从第703列开始,EXCEL的列标题有3个字母组成(从 AAA 到 XFD 止,相应的单元格表示为:AAA1,AAA2,……)。在VFP对EXCEL的操作中,如:测得最后一个数据所在列为 1378,对应的列标号是 AZZ。 对应单元格就为:AZZ1,AZZ,……,AZZn,……
请问 VF 如何用 1378 转换出 AZZ 来?

程序代码:SET SAFETY OFF
CREATE TABLE CS (id n(6),zdmzm c(3))
CLOSE DATABASES
SELECT 0
USE cs ALIAS bmk
ZAP
_x=16384
FOR _i=1 TO _x
DO CASE
CASE _i<=26 &&& 一个字母标号
dygz=CHR(64+_i)
CASE _i>=27 AND _i<=702 &&& 二个字母标号
IF MOD(_i,26)=0
_zm1=CHR(64+INT(_i/26)-1)
_zm2=CHR(64+MOD(_i,26)+26)
dygz= _zm1+_zm2
ELSE
_zm1=CHR(64+INT(_i/26))
_zm2=CHR(64+MOD(_i,26))
dygz=_zm1+_zm2
ENDIF
CASE _i>=703 &&& 三个字母标号
IF MOD(_i,676)=0
_zm1=CHR(64+INT(_i/676)-1)
_zm2=CHR(64+MOD(INT(_i/26),26)+25)
_zm3=CHR(64+MOD(_i,26)+26)
dygz= _zm1+_zm2+_zm3
ELSE
IF MOD(_i,26)=0 AND MOD(INT(_i/26),26)<>0
_zm1=CHR(64+int(INT(_i/26)/26))
_zm2=CHR(64+MOD(INT(_i/26),26)-1)
_zm3=CHR(64+MOD(_i,26)+26)
IF MOD(INT(_i/26),26)=1
_zm1=CHR(64+INT(INT(_i/26)/26)-1)
_zm2=CHR(64+MOD(INT(_i/26),26)+25)
ENDIF
dygz= _zm1+_zm2+_zm3
ELSE
IF MOD(INT(_i/26),26)=0
_zm1=CHR(64+INT((_i-26)/676))
_zm2=CHR(64+MOD(INT(_i/26),26)+26)
_zm3=CHR(64+MOD(_i,26))
dygz= _zm1+_zm2+_zm3
ELSE
_zm1=CHR(64+INT((_i-26)/676))
_zm2=CHR(64+MOD(INT(_i/26),26))
_zm3=CHR(64+MOD(_i-26,26))
dygz= _zm1+_zm2+_zm3
ENDIF
ENDIF
ENDIF
OTHERWISE
ENDCASE
SELECT bmk
APPEND BLANK
REPLACE zdmzm WITH dygz
ENDFOR
SELECT bmk
REPLACE id WITH RECNO() ALL
BROWSE
RETURN
程序代码:SET SAFETY OFF
PUBLIC cTXT
CREATE TABLE CS (id n(6),zdmzm c(3))
CLOSE DATABASES
SELECT 0
USE cs ALIAS bmk
ZAP
cTXT="ABCDEFGHIJKLMNOPQRSTUVWXYZ" &&& 思路决定出路,这一句定义非常重要,使得后面的代码简化了很多。
_x=16384 &&& EXCEL2007 的表共有 16384 列
FOR _i=1 TO _x
DO CASE
CASE _i<=26 &&& 一个字母标号
dygz=SUBSTR(cTXT,_i,1)
CASE _i>=27 AND _i<=702 &&& 二个字母标号
_zm1=INT((_i-1)/26) &&& 27-52,均为A,取cTXT中的第一个,为避开52/26=2,所以要 ( _i-1) / 26,整数部分
_zm2=IIF(MOD(_i,26)=0,26,MOD(_i,26)) &&& 从27-52,除以26的余数为1-25和0,0时为最后一个字母,故用IIF来转换成26。
dygz=SUBSTR(cTXT,_zm1,1)+SUBSTR(cTXT,_zm2,1)
CASE _i>=703 &&& 三个字母标号
_zm1=IIF(MOD(INT((INT((_i-1)/26)-1)/26),26)=0,26, MOD(INT((INT((_i-1)/26)-1)/26),26))
_zm2=IIF(MOD(INT((_i-1)/26),26)=0,26,MOD(INT((_i-1)/26),26))
_zm3=IIF(MOD(_i,26)=0,26,MOD(_i,26))
dygz=SUBSTR(cTXT,_zm1,1)+SUBSTR(cTXT,_zm2,1)+SUBSTR(cTXT,_zm3,1)
OTHERWISE
ENDCASE
SELECT bmk
APPEND BLANK
REPLACE zdmzm WITH dygz
ENDFOR
SELECT bmk
REPLACE id WITH RECNO() ALL
BROWSE
RETURN

