吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 692|回复: 9
收起左侧

求VBA大佬帮忙解决一个问题

[复制链接]
凌乱的思绪 发表于 2019-8-22 09:45
50吾爱币
点击添加按钮,新添加的数据序号则为M。最多排序到ZZ
请问如何写这个循环判断?

附加题,这个是选做题。点击添加按钮,如果上面是序号E那么添加的新数据序号为F
1565192606371.jpg

最佳答案

查看完整内容

下午有时间 就帮你写了下 你看看是不是你要的效果 [mw_shl_code=vb,true]'作者:yangcongs '时间:2019.8.22 '版本:V1.0 Sub 宏1() Dim Ln As String '第一列最后一次出现的非空单元格的行号 Dim str As String '单元格中的字符串 Dim a As Long '字符串长度 Dim str1 As String '字符串中的最后一个字母 Dim str2 ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

yangcongs 发表于 2019-8-22 09:45
本帖最后由 yangcongs 于 2019-8-22 17:57 编辑

下午有时间 就帮你写了下 你看看是不是你要的效果

[Visual Basic] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
'作者:yangcongs
'时间:2019.8.22
'版本:V1.0
 
Sub 宏1()
    Dim Ln         As String          '第一列最后一次出现的非空单元格的行号
    Dim str        As String          '单元格中的字符串
    Dim a          As Long            '字符串长度
    Dim str1       As String          '字符串中的最后一个字母
    Dim str2       As String          '字符串中的第一个字母
    Dim Fv         As String          '字符串最后一个字母的编码字符
    Dim Sv         As String          '字符串第一个字母的编码字符
    Dim AddV       As String          '下一个单元格应填入的字母序号
 
    '取第一列最后一次出现的非空单元格的行号
    Ln = Cells(Rows.Count, 1).End(xlUp).Row
    '取出该单元格中的字符串
    str = Range("A" + Ln).Value
    '获取该字符串的长度
    a = Len(str)
    '判断字符串中字母个数
 
    '如果只有一个字母
    If a = 1 Then
        '把字母转换成编码字符
        Fv = Right("000" + AscW(str), 4)
        Fv = Fv + 1
        '判断该字母的编码字符递增之后是否超出大写字母的界限
 
        If Fv > 90 Then
            '如果超出界限,则下一个单元格应填入"AA"
            Worksheets("Sheet1").Range("A" & Ln + 1).Value = "AA"
        Else
            '如果没有超出界限,则把该编码字符转换成字母
            AddV = Chr(Fv)
            '把该字母填入下一个单元格
            Worksheets("Sheet1").Range("A" & Ln + 1).Value = AddV
        End If
 
        '如果有两个字母
    ElseIf a = 2 Then
        '取出最后一个字母
        str1 = Right(str, 1)
        '取出第一个字母
        str2 = Mid(str, 1, 1)
        '把最后一个字母转换成编码字符
        Fv = Right("000" + AscW(str1), 4)
        Fv = Fv + 1
        '判断最后一个字母的编码字符递增之后是否超出大写字母的界限
 
        If Fv > 90 Then
            '如果超出界限,则最后一个字母递增之后应为"A"
            '此时需要把第一个字母递增
 
            '把第一个字母转换成编码字符
            Sv = Right("000" + AscW(str2), 4)
            Sv = Sv + 1
            '判断第一个字母的编码字符递增之后是否超出大写字母的界限
             
            If Sv > 90 Then
                '如果超出界限,此时两个字母都是"Z",到达上限
                '我给出的处理是弹出提示框,结束程序
                MsgBox ("已经到达最大行!")
                '退出程序
                Exit Sub
            Else
                '如果没有超出界限,把递增之后的第一个字母的编码字符转换成字母
                AddV = Chr(Sv)
                '把递增之后的字母填入下一个单元格
                Worksheets("Sheet1").Range("A" & Ln + 1).Value = AddV & "A"
            End If
        Else
            '如果没有超出界限,则第一个字母不变,第二个字母递增
 
            '把第二个字母递增之后的编码字符转换成字母
            AddV = Chr(Fv)
            '把递增之后的字母填入下一个单元格
            Worksheets("Sheet1").Range("A" & Ln + 1).Value = str2 & AddV
        End If
    End If
End Sub


代码注释的应该算是比较详尽了

下边是成品链接 http://t.cn/AiQYsdSU

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
凌乱的思绪 + 1 + 1 谢谢老哥辛苦解答了,感激不尽

查看全部评分

yangcongs 发表于 2019-8-22 10:09
本帖最后由 yangcongs 于 2019-8-22 10:20 编辑

我这里有一个思路 你可以试一下
根据ASCII编码 字符A的16进制值是41(10进制值是65) 往后递增
你可以先读取第一列的字符 转换成16进制值
然后对比一下第一列最大的值是几
这个值加1就是下一个字母 把他转换成字符显示在下一行
 楼主| 凌乱的思绪 发表于 2019-8-22 10:31
yangcongs 发表于 2019-8-22 10:09
我这里有一个思路 你可以试一下
根据ASCII编码 字符A的16进制值是41(10进制值是65) 往后递增
你可以 ...

我的想法是先获取单元格地址,然后判断单元格内的内容,进行循环。但是失败了
我去试试你的想法,感谢
yangcongs 发表于 2019-8-22 10:44
本帖最后由 yangcongs 于 2019-8-22 10:51 编辑
凌乱的思绪 发表于 2019-8-22 10:31
我的想法是先获取单元格地址,然后判断单元格内的内容,进行循环。但是失败了
我去试试你的想法, ...

如果你的序号是严格按照字母顺序排列的话
也可以直接取最后一个字符的啊
Cells(Rows.Count, 1).End(xlUp).Row
用这个代码应该可以的
他的意思是取第一列最后一次出现的非空单元格的行号
 楼主| 凌乱的思绪 发表于 2019-8-22 10:52
yangcongs 发表于 2019-8-22 10:44
如果你的序号是严格按照字母顺序排列的话
也可以直接取最后一个字符的啊
Cells(Rows.Count, 1).End(xl ...

序号严格按照字母排序A到Z然后AA到ZZ
yangcongs 发表于 2019-8-22 11:24
凌乱的思绪 发表于 2019-8-22 10:52
序号严格按照字母排序A到Z然后AA到ZZ

那你取出字符之后先判断一下字符长度a=len(str)

如果a=1就是只有一个字母 转换成16进制之后直接加1

如果加1之后小于等于5A(10进制值是90) 意思是还没有超过“Z” 直接把这个值转成字符就行了
如果大于5A 意思是当前字母是Z 那下一个字符就是AA了

如果a>1(你说最大ZZ的话就是a=2) 意思就是不止有一个字母
那就取出最后一个字母转成16进制
然后加1 再进行判断 判断过程跟a=1的时候是一样的

如果加1之后小于等于5A 意思是还没有超过“Z”
如果大于5A 意思是当前字母是Z 那当前字母的下一个就是A了
这时候就把倒数第二个字母转换成16进制加1(如果最大值不止两位字母的话也得进行判断)再转成字符

以此类推
wuai992 发表于 2019-8-22 17:27
兄嘚,由于我实在不明白你说的,我给你提供坐标,,zz1的坐标为cells(1,702),即zz=702,,,,解决你的问题应该要把坐标换成阿拉伯数字,然后再下一步???
ydjhome 发表于 2019-8-22 23:49
本帖最后由 ydjhome 于 2019-8-23 00:13 编辑

Public Function getrow(index)

getrow = ""

While index > 0

index = index - 1

getrow = Chr(index Mod 26 + 65) & getrow

index = Int((index - index Mod 26) / 26)

Wend

End Function

我这个虽然是个自定义函数,你可以自行修改。你将index赋值为1时,getrow就会输出‘A’,当index赋值为27时,getrow就会输出‘AA’,以此类推。至于将getrow放到哪个单元格中,你可以根据你自己的程序来确定。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
凌乱的思绪 + 1 + 1 感谢解答

查看全部评分

 楼主| 凌乱的思绪 发表于 2019-8-23 10:21
ydjhome 发表于 2019-8-22 23:49
Public Function getrow(index)

getrow = ""

上面已经有为老哥指点我了,还是感谢您
免费的热心送您 哈哈
返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-5-22 06:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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