VBA-EXCEL

初始设定

1
2
3
4
5
Dim oExcel, oWb, oSheet
Set oExcel = CreateObject("Excel.Application")
Set oWb = GetObject(, "Excel.Application") 使用已打开的文件
'oWb= oExcel.Workbooks.Open("E:\其他\新装电话表.xls") 使用本地文件
Set oSheet = oWb.Sheets("Sheet1")

如果只是单个Sheet的小程序 上面的定义都可以略去。

关于GetObject和CreateObject的区别,可以参考这里或者附件一(精简版)

关于Range和Cell

Cell是指一个单元格

Range是指一个区域的单元格

Range(“A1”)和Cells(1,1)是指同一个单元格。Range可以配合固定字符串使用,比如Range(“c4:e10”)

Range是一种对象 Cells是一个属性。 都可以用.Value 来获取、设置内容

可用 expression.Cells(row, column) 返回单元格区域中的一部分,其中 expression 是返回 range 对象的表达式,row 和 column 为相对于该区域左上角的偏移量。下例设置单元格 C5 的值。

myChart.Application.Range(“C5:C10”).Cells(1, 1).Value = 35

Range(“A:A”) A列

Range(“1:1”) 第1行

Range(“A:C”) A列到C列

Range(“1:5”) 第1行到第5行

Range(“1:1,3:3,8:8:)第1、3、8行

Range(“A:A,C:C,F:F”)A、C、F列

更多可以看这里:传送门1 传送门2 传送门3

关于VBA调用Exccel函数

Application.WorksheetFunction.函数名

例如 Application.WorksheetFunction.CountIf()

考虑到比较长,建议配合VB中With……End With 来简写

另外 某些函数返回错误值 #N/A时,VBA会提示错误信息,则必须要On Error Resume Next 配合Err.Number 使用 让程序分情况处理

附件二列出了VBA中可用的Excel函数

其他

工作表总数:Worksheets.Count

遍历某个区域内所有单元格: For Each rg In Worksheets(i).Range(“E4”, “I18”)…………Next

是否为合并单元格:Range.MergeCells() 真为合并

单元格内容格式设置:range.Characters(start:=?,Length:=?).Font.+ Name/Size/……

For循环没有Coutinue 只能用If等功能来跳过

附件一:

1、CreateObject( ‘excel.类’)

2、CreateObject( ‘excel.类’, ‘文件名.xls’ )

对Application类,无论有无进程已启动,均启动新进程; 无论是否提供文件名,均无文件打开。
对Sheet类, 无进程时启动新进程; 无论是否提供文件名,均另外打开新文件。

3、GetObject( ‘文件名.xls’, ‘excel.类’ )

4、GetObject( ‘’,’excel.类’)

对Application类,无论有无进程已启动,均启动新进程; 无论是否提供文件名,均无文件打开。
对Sheet类,无进程时启动新进程; 无论是否提供文件名,均另外打开新文件。

5、GetObject( ,’exel.类’ )

对Application类, 无进程已启动时,OLE错误;有进程已启动,不启动新进程,不产生新表。实际上只是取得当前进程的一个引用。
对Sheet类,均提示OLE错误。

由上可知

  • 1、2、3、4其实是一样的。 5只适用于exce.Application,不适用于excel.Sheet
  • Excel.Sheet是WorkBook对象,而不是Sheet或WorkSheet对象。
  • 在Application.Visible = .t. 的情况下,Release不能退出Excel。但如果Application.Visible = .f.,可以用Release直接退出Excel,终止进程。
  • 以上测试基于VFP9 + Excel2003,欢迎指正。)

附件二:

下表列出了所有可用 WorkSheetFunction 对象调用的工作表函数。有关特定函数的详细信息,请参阅 Microsoft Office Online 上的函数参考主题。
AccrInt
AccrIntM
Acos
Acosh
AmorDegrc
AmorLinc
And
Application
Asc
Asin
Asinh
Atan2
Atanh
AveDev
Average
AverageIf
AverageIfs
BahtText
BesselI
BesselJ
BesselK
BesselY
BetaDist
BetaInv
Bin2Dec
Bin2Hex
Bin2Oct
BinomDist
Ceiling
ChiDist
ChiInv
ChiTest
Choose
Clean
Combin
Complex
Confidence
Convert
Correl
Cosh
Count
CountA
CountBlank
CountIf
CountIfs
CoupDayBs
CoupDays
CoupDaysNc
CoupNcd
CoupNum
CoupPcd
Covar
Creator
CritBinom
CumIPmt
CumPrinc
DAverage
Days360
Db
Dbcs
DCount
DCountA
Ddb
Dec2Bin
Dec2Hex
Dec2Oct
Degrees
Delta
DevSq
DGet
Disc
DMax
DMin
Dollar
DollarDe
DollarFr
DProduct
DStDev
DStDevP
DSum
Duration
DVar
DVarP
EDate
Effect
EoMonth
Erf
ErfC
Even
ExponDist
Fact
FactDouble
FDist
Find
FindB
FInv
Fisher
FisherInv
Fixed
Floor
Forecast
Frequency
FTest
Fv
FVSchedule
GammaDist
GammaInv
GammaLn
Gcd
GeoMean
GeStep
Growth
HarMean
Hex2Bin
Hex2Dec
Hex2Oct
HLookup
HypGeomDist
IfError
ImAbs
Imaginary
ImArgument
ImConjugate
ImCos
ImDiv
ImExp
ImLn
ImLog10
ImLog2
ImPower
ImProduct
ImReal
ImSin
ImSqrt
ImSub
ImSum
Index
Intercept
IntRate
Ipmt
Irr
IsErr
IsError
IsEven
IsLogical
IsNA
IsNonText
IsNumber
IsOdd
Ispmt
IsText
Kurt
Large
Lcm
LinEst
Ln
Log
Log10
LogEst
LogInv
LogNormDist
Lookup
match
Max
MDeterm
MDuration
Median
Min
MInverse
MIrr
MMult
Mode
MRound
MultiNomial
NegBinomDist
NetworkDays
Nominal
NormDist
NormInv
NormSDist
NormSInv
NPer
Npv
Oct2Bin
Oct2Dec
Oct2Hex
Odd
OddFPrice
OddFYield
OddLPrice
OddLYield
Or
Parent
Pearson
Percentile
PercentRank
Permut
Phonetic
Pi
Pmt
Poisson
Power
Ppmt
Price
PriceDisc
PriceMat
Prob
Product
Proper
Pv
Quartile
Quotient
Radians
RandBetween
Rank
Rate
Received
Replace
ReplaceB
Rept
Roman
Round
RoundDown
RoundUp
RSq
RTD
Search
SearchB
SeriesSum
Sinh
Skew
Sln
Slope
Small
SqrtPi
Standardize
StDev
StDevP
StEyx
Substitute
Subtotal
Sum
SumIf
SumIfs
SumProduct
SumSq
SumX2MY2
SumX2PY2
SumXMY2
Syd
Tanh
TBillEq
TBillPrice
TBillYield
TDist
Text
TInv
Transpose
Trend
Trim
TrimMean
TTest
USDollar
Var
VarP
Vdb
VLookup
Weekday
WeekNum
Weibull
WorkDay
Xirr
Xnpv
YearFrac
YieldDisc
YieldMat
ZTest

附件三

一个小程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Sub CommandButton1_Click()
With Application.WorksheetFunction
On Error Resume Next
Dim oExcel, oWb, oSheet
Range("K:K").Value = ""
Range("L:L").Value = ""
Range("K1").Value2 = "姓名"
Range("L1").Value = "休息天数"
Dim i, j, Num As Integer
Num = 0
While Cells(i + 1, 1).Value <> ""
i = i + 1
j = 0
j = .Match(Cells(i, 1).Value, Range(Cells(1, 11), Cells(Num + 1, 11)), 0)
If j = 0 Then
Num = Num + 1
j = Num + 1
Cells(j, 11).Value = Cells(i, 1).Value
End If
Cells(j, 12).Value = Cells(j, 12).Value + .CountIf(Range(Cells(i, 2), Cells(i, 8)), "休")
Wend
MsgBox "共统计 " & Str(i) & " 项,共 " & Str(Num) & " 人"
End With
End Sub