2020 / 06 /08 以前的文章,修改了一下,代码格式全废了。。。
1.0版本中有两个问题,现在已经修正了
'履历 '2010/10/23(周六)下午第一版做成 '2010/10/26(周二)晚上,对于两个问题进行了修改(1不含有下划线的情况,2开头字母不应大写) '版权所属:sun 2010/10/23 Private Sub underLine_Click() '版权所属:sun 2010/10/23 '数据库中的列名 Dim dbColumnStr As String '开始的位置,由横竖坐标确认 Dim index As Integer Dim rangeStr '行(横) index = 6 '列(竖) rangeStr = "B" '生成单元个位置,这里没有自动装箱,所以要用一个函数把数字转换一下 rangeStr = rangeStr + CStr(index) '单元个位置生成正确与否,测试用 'MsgBox rangeStr '判断不为空,注意这里要用""空串,而不能使用null,null时永远false Do While Sheet1.Range(rangeStr).Value <> "" '进入循环测试用 'MsgBox rangeStr 'Excel中的数据(数据库中的列名) dbColumnStr = Sheet1.Range(rangeStr).Value '调用对数据库中列明处理的函数 Call underLineEscape_upcase(dbColumnStr) '处理之后位置,稍微往右移动一下 rangeStr = "C" '通过横竖两个坐标,组合出生成的位置 rangeStr = rangeStr + CStr(index) '输出处理之后的数据 Sheet1.Range(rangeStr).Value = dbColumnStr '读取下一个数据 index = index + 1 '源数据的位置还要变回来 rangeStr = "B" '通过横竖两个坐标,组合出源数据的位置 rangeStr = rangeStr + CStr(index) Loop MsgBox "end" '版权所属:sun 2010/10/23 End Sub '发现下划线,去掉,得到以下划线分割的字符串 (不知道是否有java中split的功能) Sub underLineEscape_upcase(ByRef dbColumnStr As String) '版权所属:sun 2010/10/23 '存放分割后组合的字符串 Dim str As String '存放每一个分割的字符串 Dim splitStr As String '初始化一下 str = "" '在VBA中,字符串索引从1开始 Dim index '如果返回的不是0,就表明查到数据了,则继续循环 Dim flag '初始化开始位置 index = 1 '初始化flag flag = 1 '获取字符串长度 length = Len(dbColumnStr) '获取第一个"_"的位置,不在循环里面 index = InStr(index, dbColumnStr, "_") '20100206 修改 (原因1:当不含有"_"的情况),直接在循环最后一步,会把受str的值付给dbColumnStr,而str的初值是"" If index = 0 Then str = dbColumnStr '20100206 修改 (原因1:当不含有"_"的情况) 添加条件 And index <> 0 当不含下划线时,便不会进入循环,之前忘记以对flag的初值设为1,不能再用flag判断 '当没有找到 flag=0,或 超过长度时,退出循环 Do While (flag <> 0 And index <= length And index <> 0) '获取字符串中"_"的位置 index = InStr(index, dbColumnStr, "_") '如果最后一次没有查到那么index=0,而之前还查到了(一次也没有的情况不会进入循环), '这时flag中,保存的还是是上一个"_"的位置,但是由于下面的判断flag不等于一时会加一 '所以,这里还要加一,否则最后一个串会少一个长度 If index = 0 Then index = length + 1 '如果是从找到"_"的位置开始需要加1,因为flag存的是"_"的位置 If flag <> 1 Then flag = flag + 1 '获取字符串,以"_"分割 splitStr = Mid(dbColumnStr, flag, index - flag) '20100206 修改 (原因2:开始的第一个字母大写了),增加判断条件,当第一次时,不调用字母转换函数(不将取得串的第一个字母变为大写) '20100206 修改 (原因2:开始的第一个字母大写了),因为flag代表开始的位置,flag=1表明是第一个 '20100206 修改 (原因2:开始的第一个字母大写了),注意这里Call好像不能换行(中间再隔一行干注释),否则编译出错,不知道为什么?反正现在好用了! '把第一个字母变成大写 If flag <> 1 Then Call firstCharToUpcase(splitStr) '测试时使用 'MsgBox splitStr '把每一个分割后并且转换为大写的字符串组合起来 str = str + splitStr '因为有0的判断,所以不能加1。同时在上面还有使用,这样就不用再定义一个临时变量存index了 flag = index '改变下一个索引开始的位置,也就是"_"之后那个字母的索引 index = index + 1 Loop '分割后的字符串,因为是应用传值,这里就相当于return dbColumnStr = str '版权所属:sun 2010/10/23 End Sub '把字符串中的第一个字母变成大写 Sub firstCharToUpcase(ByRef str As String) '版权所属:sun 2010/10/23 Dim tempStr Dim length '获取长度 length = Len(str) '为了保留小写部分,使用后两位 tempStr = str '使用转换为大写的第一位 str = StrConv(str, vbUpperCase) '把第一位和后两位拼接起来 str = Mid(str, 1, 1) + Mid(tempStr, 2, length) '版权所属:sun 2010/10/23 End Sub