标题:EXCEL中如何求得单元格所在列的标题字母
只看楼主
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
回复 10楼 sdta
好用,谢谢!
2020-08-28 07:17
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用wengjl在2020-8-27 13:09:18的发言:

@吹水佬
VFP的代码如何写?

有用的就一句,加个EXCEL对象就是了。
也试写个VFP代码硬算:

程序代码:
MESSAGEBOX(GetColumName(1378))
RETURN

FUNCTION GetColumName(sz)
    LOCAL m,zm
    zm = ""
    DO WHILE sz > 0
        m = sz%26
        sz = INT(sz/26)
        IF m==0
            m = 26
            sz = sz-1
        ENDIF
        zm = CHR(m+64) + zm
    ENDDO
    RETURN zm
ENDFUNC 
2020-08-28 09:34
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:108
帖 子:2175
专家分:3785
注 册:2007-4-27
得分:0 
向大佬们汇报一下:
这是在发贴前,花了2天时间弄好的代码。但感觉太繁,又想不出简化的办法,所以发贴了
程序代码:
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 


**********************
以下是根据7楼王大厨的VBA改变的,具有可读性。他的精要点在于:1、准备了26个字母的文本字符串,2、在于 减1 后再除以26再取整的思维,3、遇到整除时,用IIF切换
程序代码:
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/262,所以要 ( _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 

只求每天有一丁点儿的进步就可以了
2020-08-28 10:09
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
好!都是大拿,谢谢分享!
2020-08-28 11:26
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:108
帖 子:2175
专家分:3785
注 册:2007-4-27
得分:0 
这帖子的逆运算,可以用来计算几个字母组合的位次号

如:B为2号、BB为54号,BBB为1406号,BBBB为36558号,……

只求每天有一丁点儿的进步就可以了
2020-08-28 15:39
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
回复 15楼 wengjl
想法是美好的,现实是残酷的!

坚守VFP最后的阵地
2020-08-29 10:02
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
等级分排名最多12门科目
最大值:9999999999999998

坚守VFP最后的阵地
2020-08-30 09:46
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:108
帖 子:2175
专家分:3785
注 册:2007-4-27
得分:0 
逆向运算

MESSAGEBOX(GetColName("Xfd"))
RETURN

FUNCTION GetColName(sz)
    LOCAL m,zm
    zm = 0
    FOR nvar=1 TO LEN(sz)
       m=ASC(SUBSTR(UPPER(sz),nvar,1))-64
       zm=zm*26+m
    ENDFOR        
    RETURN zm
ENDFUNC

只求每天有一丁点儿的进步就可以了
2020-08-31 08:14
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
回复 18楼 wengjl
假如有6门科目(等级分分别为AAAAAA-FFFFFF)
AAAAAA = 12356631
FFFFFF = 74139786
共有61783156种排列方式
但你现在只有1W名以内的学生,不知道你用这样的方法计算出来的位次(你说的位次应该是我们平时所说的名次吧)有什么意义

坚守VFP最后的阵地
2020-09-02 07:30
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:108
帖 子:2175
专家分:3785
注 册:2007-4-27
得分:0 
  发这个帖子最后实现的目标如下,是为了动态复制有数据的区域(win7.0+vfp8.0+office2007通过)

    ……
    Mx_UsedRange =Mx_excel.worksheets(Mx_SheetName).UsedRange
    Mx_rows=Mx_UsedRange.rows.count  
    Mx_cols=Mx_UsedRange.columns.count  
    IF Mx_cols<=26
        dygz=CHR(Mx_cols+64)+ALLTRIM(STR(Mx_rows))  
    ELSE
      IF MOD(Mx_cols,26)=0  
          dygz=CHR(64+INT(Mx_cols/26)-1)+CHR(64+MOD(Mx_cols,26)+26)+ALLTRIM(STR(Mx_rows))
      ELSE
         dygz=CHR(64+INT(Mx_cols/26))+CHR(64+MOD(Mx_cols,26))+ALLTRIM(STR(Mx_rows))
      ENDIF
    ENDIF
    Mx_excel.ActiveSheet.Range("A2:"+dygz).Copy
    ……

只求每天有一丁点儿的进步就可以了
2020-11-23 09:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-502968-1-1.html




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

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