目录
1.2 用VBA读写本工作簿workbook里的特定sheet的特定内容
1.3 用VBA读写本工作簿workbook里的所有sheet的内容
1 用VBA读写EXCEL文件
- 因为VBA内嵌在EXCEL里,所以,VBA处理EXCEL文件是最近的楼台
- vba 读写EXCEL文件,不需要 read, write 等关键词语句或者函数,直接读写即可,比较顺畅
1.1 VBA 针对 EXCEL相关的语法内容
1.1.1 EXCEL文件的层级关系
application(EXCEL/WORD/ppt) ----workbook-----worksheets-----worksheet-----range()/cell()/rows()/columns()
1.1.2 这些都对象,和python等新语言一样
- 需要定义为对象
- 然后用set 语句赋值
- 既然都是对象,那么就可以使用
- 对象.方法, 对象.属性
- 比如
- sheet.name
- worksheets.count
dim sh as object
set sh=thisworkbook.activesheet
或者
dim sh as worksheet
set sh=thisworkbook.worksheets("")
1.1.3 遍历sheet
- for each sh in thisworkbook.worksheets
- next
- for i = 1 to thisworkbook.worksheets.count
- next
Sub test301()
Dim sh As Object
For Each sh In ThisWorkbook.Worksheets
Debug.Print sh.Name
Next
For i = 1 To ThisWorkbook.Worksheets.Count
Debug.Print ThisWorkbook.Worksheets(i).Name
Next
End Sub
1.1.4 具体存储内容的对象
注意不同的表示方法的细微差别
- sheet.cells(i,j)
- sheet.range("a1:c5")
- sheet.rows(5)
1.1.5 还有很多有用的特殊用法
- sheet.usedrange()
- cells().end(xltoup)
- ...
1.2 用VBA读写本工作簿workbook里的特定sheet的特定内容
- VBA对单个sheet处理
- 特殊点:
- 处理本EXCEL文件,因为开着VBE,VBA属于本文件,所以本EXCEL表必然是打开的
- 对应语法用的也是 thisworkbook.worksheets() ,若不指定缺省也会如此默认
1.2.1 EXCEL表内内容访问
- 具体到内部,因为EXCEL天生是表格,是数组,是2维数组等
- 需要使用下面这些对象的层级
- 注意不同的表示方法的细微差别
注意不同的表示方法的细微差别
- sheet.cells(i,j)
- sheet.range("a1:c5")
- sheet.rows(5)
- sheet.usedrange()
1.2.2 注意点
- 注意用于保存workbook, worksheet的变量
- 必须先定义为对象
- 且用set赋值
- 比如
- Dim path1 As Object (或者worksheet)
- Set path1 = ThisWorkbook.Worksheets("now")
1.2.3 代码
'VBA对单个sheet处理
'特殊点:处理本EXCEL文件,因为开着VBE,VBA属于本文件,所以本EXCEL表比然是打开的
Sub print2001()
Dim path1 As Object
Set path1 = ThisWorkbook.Worksheets("now")
'读指定sheet里特定内容
Debug.Print path1.Cells(1, 1)
'往wb的指定sheet写入内容
'查下path1当前最大行
maxr = path1.Cells(9999, 1).End(xlUp).Row
path1.Cells(maxr + 1, 1) = 100
path1.Cells(maxr + 1, 2) = 101
path1.Cells(maxr + 1, 3) = 102
path1.Cells(maxr + 1, 4) = 103
End Sub
1.3 用VBA读写本工作簿workbook里的所有sheet的内容
- 目标是遍历这个,整个thisworkbook里面的内容
- '注意VBA里数组语法的 1 to 4 和1,4完全不同,后者是2维数组
1.3.1 麻烦之处
- '处理EXCEL的内容会比一般文件麻烦
- 因为EXCEL天生是表格,是数组,是2维数组等, 一般可以使用双层循环取得二维数组的内容
- 'VBA处理一个wb里的多个sheet处理,同样使用循环
- 注意正确的是 for sheet in workbook.worksheets
- 注意是 for sheet in workbook.worksheet 或 for sheet in workbook是错误的
1.3.2 方法,如何指定EXCEL里的内容范围
- 1 指定要读写的范围边界,写入数组,然后操作数组
- 2 使用 sheet.usedrange() 作为数组的数据源
1.3.3 写入内容
- 遍历 sheet,然后写入即可
'注意VBA里数组的1to4 和1,4完全不同,后者是2维数组
'VBA处理一个wb里的多个sheet处理
Sub print2002()
Dim path1 As Object
Dim wb As Object
Dim sht As Object
For Each sht In ThisWorkbook.Worksheets
Debug.Print "sheetName=" & sht.Name
maxr = sht.Cells(9999, 1).End(xlUp).Row
maxl = sht.Cells(1, 9999).End(xlToLeft).Column
Debug.Print "现有内容的最大行数=" & maxr
Debug.Print "现有内容的最大列数=" & maxl
'因为表很大,数据散布在全表的不同格子里,尝查找限定范围内的内容
'显示指定区域的内容
arr1 = sht.Range("a1:d10")
For i = LBound(arr1, 1) To UBound(arr1, 1)
For j = LBound(arr1, 2) To UBound(arr1, 2)
Debug.Print arr1(i, j),
Next
Debug.Print
Next
'显示表里用过的内容
arr2 = sht.UsedRange
For i = LBound(arr2, 1) To UBound(arr2, 1)
For j = LBound(arr2, 2) To UBound(arr2, 2)
Debug.Print arr2(i, j),
Next
Debug.Print
Next
Next
'这里写入
'往wb的指定sheet写入内容,还是先只追加1行
'查下path1当前最大行
For Each sht In ThisWorkbook.Worksheets
For k = 1 To 4
sht.Cells(maxr + 1, k) = 99 * k
Next
Next
End Sub
2 用python 读写EXCEL文件
2.1 代码例子
需要加载专门的模块---也就是前人造好的轮子,比如这2个:
import random
import xlwt
import openpyxl
with open(r"C:\Users\Administrator\Desktop\ppp2.txt",'a') as f:
f.writelines([str(cup_num)+'\n',str(capacity)+'\n'])
sss = []
for cup in state2:
a = ""
for w in cup:
a += str(w)+" "
sss.append(a+'\n')
f.writelines(sss)
#wb=xlwt.workbook(r"C:\Users\Administrator\Desktop\water1.xlsx",encoding='utf-8')
wb=xlwt.Workbook() #wb=xlwt.Workbook必须大写W?
#指定文件后,指定sheet
worksheet=wb.add_sheet("sheet1")
#指定列
print ("y=",y)
worksheet.write(y,1,[str(cup_num)+'\n']) #1-x
worksheet.write(y,2,[str(color_num)+'\n'])
worksheet.write(y,3,[str(empty_cup)+'\n'])
worksheet.write(y,4,[str(capacity)+'\n'])
sss = []
for cup in state2:
a = ""
for w in cup:
a += str(w)+","
#a=a[:-2]
sss.append(a+"|"+'\n')
worksheet.write(y,5,sss)
wb.save(r"C:\Users\Administrator\Desktop\water1.xls") #必须单独写保存语句,而且不能是xlsx xlsm #还不能是打开状态
# 末尾多, 多| 空元素之间逗号?
#存的行数为啥从25,还互相覆盖?
#新增输出到excel, 修改格式 ,之后还要读到py里解析
#新增一次循环生成多个题目
#superquiz
#eval(superquiz)
superquiz()
2.2 需要导入的模块
import xlwt
import openpyxl
2.3 基本的语法
用import xlwt
用 import openpyxl
后续不同
分2部分写把