全民一起VBA提高篇第三课:字符串与文件

大写小写汉字转换

Sub Exercise1()
    
    Dim i As Integer, j As Integer, k As String, s As String
    
    Dim cn(10) As String
    ' cn(10)代表最大下标为10,不是数组长度
    cn(0) = "零": cn(1) = "壹": cn(2) = "贰": cn(3) = "叁": cn(4) = "肆"
    cn(5) = "伍": cn(6) = "陆": cn(7) = "柒": cn(8) = "捌": cn(9) = "玖"
    
    k = CStr(Range("b5"))
    '强制转换为字符串
    s = ""
    
    For i = 1 To Len(k)
    
        j = CInt(Mid(k, i, 1))
        '分别取出每一位数字
        s = s & cn(j)
    
    Next i
    
    Range("c5") = s
    
End Sub

在这里插入图片描述

dim  a(3 to 6)
'最小下标为3,最大为6,这个数组没有a(0)

防止出现越界错误

for i = lbound(a) to ubound(a)

拆解字符串

用字符串函数

Sub 分列()
Dim first As Long, last As Long, name As String
Dim i As Long, k As String
k = Trim(Cells(3, 2)) '清理好数据
i = 3
first = 0
Do While first < Len(k) '检查

    last = InStr(first + 1, k, ",")
    '返回一个字符串在另一个字符串中首次出现的位置
    
    If last > 0 Then
    
        name = Mid(k, first + 1, last - first - 1)
        '取出两个分割符号之间的字符
        
        If Trim(name) <> "" Then
        
        Cells(i, 4) = name
        
        i = i + 1
        '把结果写出来
        End If
        
        first = last
        '跳出循环
    Else
    
        Cells(i, 4) = Mid(k, first + 1)
        '写最后一个
        Exit Do
        
    End If
    
Loop

End Sub

用split函数

Sub 分列2()
Dim a() As String, i As Long, k As Long

a = Split(Cells(3, 2), ",")
'用逗号分割,注意输入中文逗号用中文逗号,英文用英文
k = 3

For i = LBound(a) To UBound(a)
'找出上下界
    Cells(k, 4) = a(i)
    k = k + 1
Next i

End Sub

或者

Sub 分列3()
Dim a() As String, i As Long, x
'申请动态数组
a = Split(Cells(3, 2), ",")
'用逗号分割,注意输入中文逗号用中文逗号,英文用英文
i = 3

For Each x In a
'用each来找
'x必须用变体,哪怕知道他的类型,因为是数组

    Cells(i, 4) = x
    '用x赋值了
    i = i + 1
Next x

End Sub

重新给动态数组定界

Sub 动态数组案例()
Dim a() As String
k = Cells(4, 2)
ReDim a(k)
MsgBox UBound(a)
End Sub

空字符串

如果用split会给你切分得很细,有可能有空字符串,都会切出来

Sub 非空字符串原始()
Dim a() As String, i As Long, x
i = 1
a = Split(Cells(3, 2), ",")
'只有定义数组才用a(),其余用a
For Each x In a
    Cells(i, 3) = x
    MsgBox Cells(i, 3)
    i = i + 1
Next x

End Sub
Sub 非空字符串改进()
Dim a() As String, i As Long, x
Dim b() As String
i = 1
a = Split(Cells(3, 2), ",")
'只有定义数组才用a(),其余用a

For Each x In a
    If x <> "" Then i = i + 1
Next x

ReDim b(i - 1)

'因为b(i)是指上界为i,实际空间给了i+1个

i = 0

For Each x In a
    If x <> "" Then
        b(i) = x
        MsgBox b(i)
        i = i + 1
    End If
Next x

End Sub

对文本文件进行操作

读取文件

Option Explicit
Sub 读取练习()
Dim s As String, i As Long
Open "G:\网课\杨洋VBA\提高篇第11回课堂演示-2\客户信息.txt" For Input As #1
'给每个打开的文件一个数字编号
'打开一个文件
i = 1
Do While Not EOF(1)
'判断文本是否读完
Line Input #1, s
    If Left(s, 2) = "北京" Then
'用于条件筛选
        Cells(i, 1) = s
        i = i + 1
    End If
Loop

Close #1
'关闭保存
End Sub

写入文件

把三个excel工作簿中的信息汇总到一个txt里面


Sub 写入练习()
Dim s As String, i As Long
Dim w As Worksheet

Open "G:\网课\杨洋VBA\提高篇第11回课堂演示-2\客户信息.txt" For Output As #1
For Each w In Worksheets

    i = 3
        Do While Trim(w.Cells(i, 2)) <> ""
            Print #1, w.Cells(i, 2); "--"; w.Cells(i, 3)
            i = i + 1
        Loop

Next w

Close #1

'每一行print结束没有分号,默认换行,给个分号,接着一行
End Sub

文本文件补充练习

本练习是为学习《提高篇》第11回的同学所设计,请编写程序,运行后将所附文本文件(销量.txt)的数据读入左表,读入时要求使用Split函数对每行内容按空格进行拆分,然后依次写入左表。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Option Explicit
Sub 读取练习()
Dim s As String, i As Long, j As Long
Dim x
Dim a() As String
Open "G:\网课\杨洋VBA\提高篇练习-第11回-161126\销量.txt" For Input As #1
'给每个打开的文件一个数字编号
'打开一个文件
i = 6
Do While Not EOF(1)
'判断文本是否读完
Line Input #1, s
    If Asc(Left(s, 1)) >= 65 And Asc(Left(s, 1)) <= 91 Then
'用于条件筛选,目的在于去掉第一行部门/月份
        a = Split(s, " ")
        j = 2
            For Each x In a
                If x <> "" Then
'这个地方循环不能对j进行for循环,因为找不到放的位置
                        Cells(i, j) = x
                    j = j + 1
                End If
            Next x
        i = i + 1 '放在循环里面累加,不需要用for
    End If
Loop

Close #1
'关闭保存
'统计大于4500的和小于4500的,并把结果写入表格中
count1 = 0
count2 = 0
For i = 6 To 32
    For j = 3 To 15
        If Cells(i, j) >= 4500 Then
        count1 = count1 + 1
        ElseIf Cells(i, j) < 4500 And Cells(i, j) >= 0 Then
        count2 = count2 + 1
        Cells(i, j).Font.Color = vbRed

        End If
    Next j
Next i
Cells(7, 16) = count2 & "条"
Cells(9, 16) = count1 & "条"
End Sub

扫描文件夹

dir 返回文件名

Sub dirdemo()
Dim f As String
f = Dir("G:\网课\杨洋VBA\提高篇12回演示文件夹\d\demo2\")
'用f接收文件名
Do While f <> ""
    Call readfile("G:\网课\杨洋VBA\提高篇12回演示文件夹\d\demo2\" & f)
    '写成子程序便于调用
    f = Dir
Loop

End Sub

Sub readfile(fullname As String)
Dim ws As Worksheet, i As Long, s As String
Set ws = Worksheets.Add
'追加新建文件夹
ws.Name = Mid(fullname, InStrRev(fullname, "\") + 1)
'文件夹的名字用读取的文件名来写,包括后缀名,这里读取的是
'文件夹下的所有文件
Open fullname For Input As #1

i = 1

Do While Not EOF(1)
    Line Input #1, s
    ws.Cells(i, 2) = Left(s, 2)
    ws.Cells(i, 3) = Mid(s, InStr(s, "电话") + 3, 8)
    '只读取电话后面的,然后取8位
    i = i + 1
Loop

Close #1

End Sub

只要某种类型的文件

f = Dir("G:\网课\杨洋VBA\提高篇12回演示文件夹\d\demo2\")
    改写为
f = Dir("G:\网课\杨洋VBA\提高篇12回演示文件夹\d\demo2\*.txt")
f = Dir("G:\网课\杨洋VBA\提高篇12回演示文件夹\d\demo2\a*.txt")
'首字母为a
    用通配符*可破

判断文件夹下是否有某个文件

'接受主程序传来的文件名,然后打开并读入
Sub readfile(fullname As String)
'打开传来的文件名之前,先判断是否存在
If Dir(fullname) <> "" Then
    Open fullname For Input As #1
    '可以用来正常处理文件
    Close #1
Else
    MsgBox "不存在文件"
End If
End Sub

检索子文件夹的名字

Sub 子文件夹()

Dim f As String

f = Dir("G:\网课\杨洋VBA\提高篇12回演示文件夹\d\demo2\", vbDirectory)
'用于读取子文件夹,只返回一层

Do While f <> ""
    MsgBox f
    f = Dir
Loop

End Sub
发布了26 篇原创文章 · 获赞 5 · 访问量 1097

猜你喜欢

转载自blog.csdn.net/qq_43568982/article/details/103887523
今日推荐