Foxtable(狐表)用户栏目专家坐堂 → [求助]增加临时列ABCDE甚至到AA及ZZ


  共有5784人关注过本帖树形打印复制链接

主题:[求助]增加临时列ABCDE甚至到AA及ZZ

帅哥哟,离线,有人找我吗?
chnfo
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2216 积分:18225 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]增加临时列ABCDE甚至到AA及ZZ  发帖心情 Post By:2022/6/15 15:19:00 [显示全部帖子]

因为不可预知需要导入的usedrange会有多少列,所以,希望增加临时列与usedrange的列数相同
比如有3列,就增加ABC,有26列,就增加A-Z,有27列,就增加A-AA

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2216 积分:18225 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/6/15 16:13:00 [显示全部帖子]

我知道可以增加临时列的方法
但要知道增加的第一列是A,第二列是B,如果增加个60列,一个个写,就太麻烦了

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2216 积分:18225 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/6/15 22:46:00 [显示全部帖子]

不是这个意思啦。
要把excel表中的usedrange数据复制到一个DataTableBuilder建立的临时表中

因为不知道usedrange会有多少列,所以准备在临时表中增加相应的列数,第1列列名为A,……第26列列名为Z,27列列名为AA,依此类推



 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2216 积分:18225 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/6/16 9:12:00 [显示全部帖子]

execl表格没有标题行?如果有直接取标题行做列名不就行了,搞那么多花样干啥
---说对了,就是没有的
图片点击可在新窗口打开查看

因为要把表格里的usedrange读到临时表里(图示是其中两个表的示例,物品的列数并不是固定的2列或3列,多层表头也并不是固定的1层或2层或3层,需要人工识别),然后把它们做数据提取处理,要用到一些VBA的处理规则。
要读取行列标题信息,就要用到A2:D6这样的表示方法。如果用A1、A2这样的列编号,处理起来就比较麻烦
当然了,也有其它的方式来表示区域,但这样直观一些。
[此贴子已经被作者于2022/6/16 9:13:55编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2216 积分:18225 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/6/16 10:07:00 [显示全部帖子]

1、因为usedrange是获取所有的数据区域,这不是的我目的
2、步骤是
2.1、将usedrange数据导入到FT表里来,这个并不复杂
2.2、数据导入到FT表里以后,用户可以选择物品标题所在区域
但是要在FT表中用afterselrange事件,可以获取选择的区域信息。
这里,列标题就很重要,如果是ABCDE……排下来就跟excel一样,如果用A1、A2、A3这样排下来,就会感觉很怪异

但每个要导入的表1、2、3、4等等,列数、行数、要选择的物品、位置区域是不固定的
[此贴子已经被作者于2022/6/16 10:23:34编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2216 积分:18225 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/6/16 10:23:00 [显示全部帖子]

Dim dtb As New DataTableBuilder("CS")

For i As Integer = 1 To 100
    Dim x As String = ""
    Select i
        Case 1
            x = "A"
        Case 2
            x = "B"
        Case 3
            x = "C"
        Case 4  ‘如果要增加100列,不可能这么来啊’
    End Select 
    dtb.AddDef(x, GetType(String), 64)
Next 

dtb.Build()
MainTable = Tables("CS")

也就是10进制转26进制,把123456转为ABCDEF


 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2216 积分:18225 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/6/16 10:25:00 [显示全部帖子]

VBA是这么干的

Public Function Num10toN(ByVal Num As Long, Optional ByVal N As Long = 16, Optional ByVal AddNum As Long = 0) As String
Dim I As Long, J As Long, K As Long



If N < 2 Or N > 36 Then Exit Function
If N + AddNum > 36 Then Exit Function


If Num = 0 Then
Num10toN = "0"
Exit Function

End If

Static FirstRun As Boolean
Static NumChar(0 To 35) As String * 1

If FirstRun = False Then
For I = 0 To 9
NumChar(I) = CStr(I)
Next I
For I = 0 To 25
NumChar(I + 10) = Chr(Asc("A") + I)
Next I

FirstRun = True

End If

Dim TempNum As Long
Dim TempStr As String

TempNum = Num And &H7FFFFFFF '不考虑符号位

TempStr = Space(Log(Num) / Log(N) + 1)

I = Len(TempStr)
Do While TempNum > 0
J = TempNum Mod N
Mid(TempStr, I, 1) = NumChar(J + AddNum)
I = I - 1
TempNum = (TempNum - J) \ N

Loop

I = I + 1
If N = 26 And AddNum = 10 And Num >= 26 Then Mid(TempStr, I) = Chr(Asc(Mid(TempStr, I)) - 1)

Num10toN = Mid(TempStr, I)

End Function

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2216 积分:18225 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/6/16 10:35:00 [显示全部帖子]

所以,才说要做一个临时表,比如增加5列,就是ABCDE;增加26列,就是A-Z;增加27列,就是A-AA

其它的都好处理。

dim sr() as string = {"A","B","D",...},用它也是一个办法,如果有100列,那不得整晕过去

那个笑话,画一行就是一,画两行是二,画三行是三,要是这个人姓万,那咋整……图片点击可在新窗口打开查看
[此贴子已经被作者于2022/6/16 10:36:21编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2216 积分:18225 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/6/16 11:26:00 [显示全部帖子]

Dim n As Integer = Args(0)  '列序号

Dim outinfo As String = ""

Do While n > 0
    Dim m As Integer = n Mod 26 '得到余数
    If m = 0 Then
        m = 26
    End If 
    
    outinfo = chr(m + 64) & outinfo
    n = (n - m) / 26
Loop

Return outinfo

 回到顶部