全民一起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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值