第一篇:如何将excel中的数据用vba代码存入access文件中
如何将excel中的数据用vba代码存入access文件中?
excel中的 日期 供应商 货物名称 9月10日 联想公司
单价 数量
笔记本 3500 金额 2
7000 将表中的内容存储到D:备份.mdb中,如果mdb中有其他记录,将记录存入以前的记录后面。每天都要将当天采购的记录录入并保存到mdb文件 中。谢谢
以下是我用了实现从Excel导数据进ACCESS的代码,你参考一下,应该就可以做出来了:(Excel和Access两个文件放一个文件夹下)Public Sub 客户正常供价批量维护()If Cells(4, 6)= “" Then MsgBox ”请先选择需要维护价格的系统!“, vbInformation Cells(4, 6).Select Exit Sub Else
Dim i As Integer, j As Integer, k As Integer, sht As Worksheet 'i,j,k为整数变量;sht 为excel工作表对象变量,指向某一工作表
Dim cn As New ADODB.Connection '定义数据链接对象,保存连接数据库信息;请先添加ADO引用
Dim rs As New ADODB.Recordset '定义记录集对象,保存数据表 Dim strCn As String, strSQL As String '字符串变量 Dim mdbFile As String
On ErrorGoTo add_err mdbFile = ActiveWorkbook.Path & ”DY_DATA.mdb“
strCn = ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & mdbFile '定义数据库链接字符串
cn.Open strCn '与数据库建立连接,如果成功,返回连接对象cn
Set rs = New ADODB.Recordset rs.Open ”dbl直营客户正常供价表“, cn, adOpenKeyset, adLockOptimistic
k = Cells(4, 8) 8 For i = 9 To k If Cells(i, 7)= ”“ Then Else rs.AddNew rs(1)= Cells(i, 2)rs(2)= Cells(i, 7)rs(3)= Cells(i, 8)
rs.Update Cells(i, 7)= ”“ Cells(i, 8)= ”“
End If Next MsgBox ”数据记录添加成功!", vbInformation Cells(4, 6).Select ActiveWorkbook.RefreshAll
add_exit: Exit Sub End If add_err: MsgBox Err()& vbCrLf & Error()Resume add_exit End Sub 追问 vba中excel的单元格用cells(1,1),cells(1,2),cells(2,1),cells(2,2),cells(i,j)表示,在vba中access对应的单元格如何表示这些?
第二篇:Excel_2022_中很实用的几个VBA技巧
Excel 2022 中很实用的几个VBA技巧
目录
=============== 隔页打印工作表............................................................................................................1 使用 ADO 在工作簿中检索工作表名称...................................................................2 将搜索结果显示在单独的页中....................................................................................3 删除单元格的一部分....................................................................................................4 从工作表中删除空行和嵌入的字段名称....................................................................4 创建数据的主列表........................................................................................................5 根据值插入行................................................................................................................5 将文本转换为电子邮件地址........................................................................................6 根据单元格值处理字体颜色........................................................................................6 将字符附加到单元格值................................................................................................7 ===============
隔页打印工作表
本部分中的代码用于隔页打印工作簿中的工作表。它通过循环访问所有的工作表并用偶数表填充数组来做到这一点。
Sub PrintEvenSheets()
Dim mySheetNames()As String
Dim iCtr As Long
Dim wCtr As Long
iCtr = 0
For wCtr = 1 To Sheets.Count
If wCtr Mod 2 = 0 Then
iCtr = iCtr 1
ReDim Preserve mySheetNames(1 To iCtr)
mySheetNames(iCtr)= Sheets(wCtr).Name
End If
Next wCtr
If iCtr = 0 Then
'Only one sheet.Display message or do nothing.Else
Sheets(mySheetNames).PrintOut preview:=True
End If
End Sub
该示例用于打印偶数工作表。您可以循环访问所有的工作表,并根据要打印的偶数工作表来构建一个数组。可以通过删除本示例中的第一个 If...Then End If 语句来做到这一点。
使用 ADO 在工作簿中检索工作表名称
此代码示例使用 Microsoft ActiveX Data Objects(ADO)在工作簿中检索工作表的名称。通过使用 ADO,您可以在 Excel 之外处理文件。ADO 使用通用编程模型来访问许多窗体中的数据。有关 ADO 的更多信息,请参阅 ADO Programmer's Guide。
Sub GetSheetNames()
Dim objConn As Object
Dim objCat As Object
Dim tbl As Object
Dim iRow As Long
Dim sWorkbook As String
Dim sConnString As String
Dim sTableName As String
Dim cLength As Integer
Dim iTestPos As Integer
Dim iStartpos As Integer
'Change the path to suit your own needs.sWorkbook = “c:myDirBook1.xls”
sConnString = “Provider=Microsoft.Jet.OLEDB.4.0;” & _
“Data Source=” & sWorkbook & “;” & _
“Extended Properties=Excel 8.0;”
Set objConn = CreateObject(“ADODB.Connection”)
objConn.Open sConnString
Set objCat = CreateObject(“ADOX.Catalog”)
Set objCat.ActiveConnection = objConn
iRow = 1
For Each tbl In objCat.Tables
sTableName = tbl.Name
cLength = Len(sTableName)
iTestPos = 0
iStartpos = 1
'Worksheet names with embedded spaces are enclosed
'by single quotes.If Left(sTableName, 1)= “'” And Right(sTableName, 1)= “'” Then
iTestPos = 1
iStartpos = 2
End If
'Worksheet names always end in the “$” character.If Mid$(sTableName, cLength_
(iStartpos iTestPos))
MsgBox Cells(iRow, 1)
iRow = iRow 1
End If
Next tbl
objConn.Close
Set objCat = Nothing
Set objConn = Nothing
End Sub
将搜索结果显示在单独的页中
该代码示例在工作表的列中搜索单词(“Hello”)。一旦找到匹配的数据,就将其复制到另一个工作表(“Search Results”)中。
Sub FindMe()
Dim intS As Integer
Dim rngC As Range
Dim strToFind As String, FirstAddress As String
Dim wSht As Worksheet
Application.ScreenUpdating = False
intS = 1
'This step assumes that you have a worksheet named
'Search Results.Set wSht = Worksheets(“Search Results”)
strToFind = “Hello”
'Change this range to suit your own needs.With ActiveSheet.Range(“A1:C2000”)
Set rngC =.Find(what:=strToFind, LookAt:=xlPart)
If Not rngC Is Nothing Then
FirstAddress = rngC.Address
Do
rngC.EntireRow.Copy wSht.Cells(intS, 1)
intS = intS 1
Set rngC =.FindNext(rngC)
Loop While Not rngC Is Nothing And rngC.Address <> FirstAddress
End If
End With
End Sub
删除单元格的一部分
该程序搜索字符串值的范围,并删除单元格的一部分内容。在本例中,当字符“Y”或“N”通过一个或多个空格与文本正文分隔时,程序就会从该字符串中删除它。
Sub RemoveString()
Dim sStr as String, cell as Range
'Change the worksheet and column values to suit your needs.For Each cell In Range(“Sheet1!F:F”)
If cell.Value = “" Then Exit Sub
sStr = Trim(Cell.Value)
If Right(sStr, 3)= ” Y“ Or Right(sStr, 3)= ” N“ Then
cell.Value = Left(sStr, Len(sStr)1)to cell.Value = Trim(Left(sStr, Len(sStr)-1))
从工作表中删除空行和嵌入的字段名称
该示例可搜索一列数据的内容。如果单元格为空或者包含一个特定的单元格值(在此示例中为“Hello”),则代码就会删除该行,然后移到下一行进行检查。
Sub CleanUp()
On Error Resume Next
With ActiveSheet
'Change the column value to suit your needs.LastRw =.Cells(Rows.Count, ”A“).End(xlUp).Row
Set Rng1 =.Range(Cells(1, ”A“), Cells(LastRw, ”A“))
Set Rng2 =.Range(Cells(2, ”A“), Cells(LastRw, ”A“))
End With
With Rng1
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
.AutoFilter Field:=1, Criteria1:=”Hello“
Rng2.SpecialCells(xlCellTypeVisible).EntireRow.Delete
.AutoFilter End With End Sub
创建数据的主列表
该代码通过将工作表中的信息拼凑在一起来创建一个主列表。此示例创建了一个“Master”工作表,搜索列直到遇到一个空单元格,再将扫描数据复制到该 Master 工作表中,然后继续搜索下一个空单元格。
Sub CopyData()
Dim i As Long, rng As Range, sh As Worksheet
'Change these worksheet names as needed.Worksheets.Add(After:=Worksheets(_
Worksheets.Count)).Name = ”Master“
Set sh = Worksheets(”Input-Sales“)
i = 1
Do While Not IsEmpty(sh.Cells(i, 1))
Set rng = Union(sh.Cells(i, 1), _
sh.Cells(i 2, 1).Resize(3, 1))
rng.EntireRow.Copy Destination:= _
Worksheets(”Master“).Cells(Rows.Count, 1).End(xlUp)
i = i 16
Loop End Sub
根据值插入行
该示例可在某一列中搜索某个值,当找到该值时,就插入一个空行。此程序可在 B 列中搜索值“1”,当找到该值时,就插入一个空行。
Sub InsertRow()
Dim Rng As Range
Dim findstring As String
'Change the search string to suit your needs.findstring = ”1“
'Change the range to suit your needs.Set Rng = Range(”B:B“).Find(What:=findstring, LookAt:=xlWhole)
While Not(Rng Is Nothing)
Rng.EntireRow.Insert
Set Rng = Range(”B“ & Rng.Row 1 & ”:B“ & Rows.Count)_
.Find(What:=findstring, LookAt:=xlWhole)
Wend End Sub
将文本转换为电子邮件地址
以下代码可循环访问一列范围数据,并将每个条目转换为一个电子邮件地址。
Sub convertToEmail()
Dim convertRng As Range
'Change the range to suit your need.Set convertRng = Range(”B13:B16“)
Dim rng As Range
For Each rng In convertRng
If rng.Value <> ”“ Then
ActiveSheet.Hyperlinks.Add rng, ”mailto:“ & rng.Value
End If
Next rng
End Sub
根据单元格值处理字体颜色
下面的示例可根据单元格中显示的值将单元格的字体设置为某种颜色。具体来说,如果单元格包含公式(例如“=today()”),则设置为黑色,如果单元格包含数据(例如“30 Oct 2022”),则设置为蓝色。
Sub ColorCells()
On Error Resume Next
With Sheet1.UsedRange
.SpecialCells(xlCellTypeFormulas).Font.Color = vbBlack
.SpecialCells(xlCellTypeConstants).Font.Color = vbBlue
End With
On Error GoTo 0 End Sub
前面的示例可更改工作表的整个使用范围的字体颜色。以下代码片段使用 Range 对象的 HasFormula 属性来确定一个单元格是否包含公式:
Sub ColorCells2()
With Sheet1.Range(”A3“)
If.HasFormula Then
.Font.Color = vbBlack
Else
.Font.Color = vbBlue
End If
End With End Sub 或
Sub ColorCells3()
With Cells(3, 3)
.Interior.Color = IIf(.HasFormula, vbBlue, vbBlack)
End With End Sub
将字符附加到单元格值
以下程序可搜索选中的列,并将一个字符(在此示例中为撇号)附加到每个条目的开头。如果您已经选定了范围,并且没有声明 Option Explicit,则代码会如示例所示运行。如果只选择了一个单元格,那么代码仅在活动单元格中操作。
Sub AddApostrophe()
Dim cell as Range
for each cell in Selection
if not cell.hasformula then
if not isempty(cell)then
cell.Value = ”'“ & cell.Value
End if
end if
Next End sub
上述代码的变体只将字符(撇号)放在数字单元格中。该代码只在所选的数字单元格中操作。
Sub AddApostrophe()
Dim cell as Range
for each cell in Selection
if not cell.hasformula then
if not isempty(cell)then
if isnumeric(cell)then
'Change the character as needed.cell.Value = ”'" & cell.Value
end if
End if
end if
Next End sub
小结
本文介绍了可在 Excel 中使用的许多技巧和 Microsoft Visual Basic for Applications(VBA)代码。通过使用这些程序以及对它们进行修改以满足您自己的使用所需,可以使自己的应用程序更加健壮,并为您的用户提供更多的选择。http://s.taobao.com/search?q=���� Ů ����&suggest_query=���� Ů ����&sb_id=0&suggest=0_3&source=suggest&wq=CHEN
第三篇:VBA代码中引用Excel工作表中单元格区域的方式小结
VBA代码中引用Excel工作表中单元格区域的方式小结.txt大人物的悲哀在于他们需要不停地做出选择;而小人物的悲哀在于他们从来没有选择的机会。男人因沧桑而成熟,女人因成熟而沧桑。男人有了烟,有了酒,也就有了故事;女人有了钱,有了资色,也就有了悲剧。在VBA代码中引用Excel工作表中单元格区域的方式小结
问题一:在VBA代码中,如何引用当前工作表中的单个单元格(例如引用单元格C3)? 回答:可以使用下面列举的任一方式对当前工作表中的单元格(C3)进行引用。(1)Range(“C3”)(2)[C3](3)Cells(3, 3)(4)Cells(3, “C”)(5)Range(“C4”).Offset(-1)Range(“D3”).Offset(,-1)Range(“A1”).Offset(2, 2)(6)若C3为当前单元格,则可使用:ActiveCell(7)若将C3单元格命名为“Range1”,则可使用:Range(“Range1”)或[Range1](8)Cells(4, 3).Offset(-1)
------------------问题二:在VBA代码中,我要引用当前工作表中的B2:D6单元格区域,有哪些方式? 回答:可以使用下面列举的任一方式对当前工作表中单元格区域B2:D6进行引用。(1)Range(“B2:D6”)(2)Range(“B2”, “D6”)(3)[B2:D6](4)Range(Range(“B2”), Range(“D6”))(5)Range(Cells(2, 2), Cells(6, 4))(6)若将B2:D6区域命名为“MyRange”,则又可以使用下面的语句引用该区域: ① Range(“MyRange”)② [MyRange](7)Range(“B2”).Resize(5, 3)(8)Range(“A1:C5”).Offset(1, 1)(9)若单元格B2为当前单元格,则可使用语句:Range(ActiveCell, ActiveCell.Offset(4, 2))(10)若单元格D6为当前单元格,则可使用语句:Range(“B2”, ActiveCell)
------------------问题三:在VBA代码中,如何使用变量实现对当前工作表中不确定单元格区域的引用? 回答:有时,我们需要在代码中依次获取工作表中特定区域内的单元格,这通常可以采取下面的几种方式:
(1)Range(“A” & i)(2)Range(“A” & i & “:C” & i)(3)Cells(i,1)(4)Cells(i,j)其中,i、j为变量,在循环语句中指定i和j的范围后,依次获取相应单元格。------------------问题四:在VBA代码中,如何扩展引用当前工作表中的单元格区域? 回答:可以使用Resize属性,例如:
(1)ActiveCell.Resize(4, 4),表示自当前单元格开始创建一个4行4列的区域。(2)Range(“B2”).Resize(2, 2),表示创建B2:C3单元格区域。(3)Range(“B2”).Resize(2),表示创建B2:B3单元格区域。(4)Range(“B2”).Resize(, 2),表示创建B2:C2单元格区域。
如果是在一个单元格区域(如B3:E6),或一个命名区域中(如将单元格区域B3:E6命名为“MyRange”)使用Resize属性,则只是相对于单元格区域左上角单元格扩展区域,例如: 代码Range(“C3:E6”).Resize(, 2),表示单元格区域C3:D6,并且扩展的单元格区域可不在原单元格区域内。因此,可以知道Resize属性是相对于当前活动单元格或某单元格区域中左上角单元格按指定的行数或列数扩展单元格区域。
------------------问题五:在VBA代码中,如何在当前工作表中基于当前单元格区域或指定单元格区域处理其它单元格区域?
回答:可以使用Offset属性,例如:
(1)Range(“A1”).Offset(2, 2),表示单元格C3。
(2)ActiveCell.Offset(, 1),表示当前单元格下一列的单元格。(3)ActiveCell.Offset(1),表示当前单元格下一行的单元格。
(4)Range(“C3:D5”).Offset(, 1),表示单元格区域D3:E5,即将整个区域偏移一列。从上面的代码示例可知,Offset属性从所指定的单元格开始按指定的行数和列数偏移,从而到达目的单元格,但偏移的行数和列数不包括指定单元格本身。
------------------问题六:在VBA代码中,如何在当前工作表中引用交叉区域? 回答:可以使用Intersect方法,例如: Intersect(Range(“C3:E6”), Range(“D5:F8”)),表示单元格区域D5:E6,即单元格区域C3:E6与D5:F8相重迭的区域。
------------------问题七:在VBA代码中,如何在当前工作表中引用多个区域? 回答:
(1)可以使用Union方法,例如:
Union(Range(“C3:D4”), Range(“E5:F6”)),表示单元格区域C3:D4和E5:F6所组成的区域。Union方法可以将多个非连续区域连接起来成为一个区域,从而可以实现对多个非连续区域一起进行操作。
(2)也可以使用下面的代码:
Range(“C3:D4, E5:F6”)或[C3:D4, E5:F6] 注意:Range(“C3:D4”, “F5:G6”),表示单元格区域C3:G6,即将两个区域以第一个区域左上角单元格为起点,以第二个区域右下角单元格为终点连接成一个新区域。
同时,在引用区域后使用Rows属性和Columns属性时,注意下面代码的区别: ①Range(“C3:D4”, “F8:G10”).Rows.Count,返回的值为8; ②Range(“C3:D4,F8:G10”).Rows.Count,返回的值为2,即只计算第一个单元格区域。
------------------问题八:在VBA代码中,如何引用当前工作表中活动单元格或指定单元格所在的区域(当前区域)?
回答:可以使用CurrentRegion属性,例如:
(1)ActiveCell.CurrentRegion,表示活动单元格所在的当前区域。(2)Range(“D5”).CurrentRegion,表示单元格D5所在的当前区域。
当前区域是指周围由空行或空列所围成的区域。该属性的详细使用参见《CurrentRegion属性示例》一文。
------------------问题九:在VBA代码中,如何引用当前工作表中已使用的区域? 回答:可以使用UsedRange属性,例如:
(1)Activesheet.UsedRange,表示当前工作表中已使用的区域。
(2)Worksheets(“sheet1”).UsedRange,表示工作表sheet1中已使用的区域。
与CurrentRegion属性不同的是,该属性代表工作表中已使用的单元格区域,包括显示为空行,但已进行过格式的单元格区域。该属性的详细使用参见《解析UsedRange属性》一文。
------------------问题十:如何在单元格区域内指定特定的单元格? 回答:可以使用Item属性,例如:
(1)Range(“A1:B10”).Item(5,3)指定单元格C5,这个单元格处于以区域中左上角单元格A1(即区域中第1行第1列的单元格)为起点的第5行第3列。因为Item属性为默认属性,因此也可以简写为:Range(“A1:B10”)(5,3)。如果将A1:B10区域命名为”MyRange”,那么Range(“MyRange”)(5,3)也指定单元格C5。(2)Range(“A1:B10”)(12,13)指定单元格M12,即用这种方式引用单元格,该单元格不必一定要包含在区域内。
同时,也不需要索引数值是正值,例如: ① Range(“D4:F6”)(0,0)代表单元格C3; ② Range(“D4:F6”)(-1,-2)代表单元格A2。而Range(“D4:F6”)(1,1)代表单元格D4。(3)也可以在单元格区域中循环,例如:
Range(“D4:F6”)(2,2)(3,4)代表单元格H7,即该单元格位于作为左上角单元格E5的第3行第4列(因为E5是开始于区域中左上角单元格D4起的第2行第2列)。
(4)也能使用一个单个的索引数值进行引用。计数方式为从左向右,即在区域中的第一行开始从左向右计数,第一行结束后,然后从第二行开始从左到右接着计数,依次类推。(注:从区域中第一行第一个单元格开始计数,当第一行结束时,转入第二行最左边的单元格,这样按一行一行从左向右依次计数。以单元格区域中第1个单元格开始,按上述规则依次为第2个单元格、第3个单元格„.等等),例如: Range(“A1:B2”)(1)代表单元格A1; Range(“A1:B2”)(2)代表单元格B1; Range(“A1:B2”)(3)代表单元格A2; Range(“A1:B2”)(4)代表单元格B2。这种方法可在工作表中连续向下引用单元格(即不一定是在单元格区域内,但在遵循相同的规律),例如:
Range(“A1:B2”)(5)代表单元格A3;
Range(“A1:B2”)(14)代表单元格B7,等等。也可以使用单个的负数索引值。
这种使用单个索引值的方法对遍历列是有用的,例如,Range(“D4”)(1)代表单元格D4,Range(“D4”)(2)代表单元格D5,Range(“D4”)(11)代表单元格D14,等等。同理,稍作调整后也可遍历行,例如:
Range(“D4”).Columns(2)代表单元格E4,Range(“D4”).Columns(5)指定单元格H4,等等。(5)当与对象变量配合使用时,Item属性能提供简洁并有效的代码,例如: Set rng = Worksheets(1).[a1] 定义了对象变量后,像单元格方法一样,Item属性允许使用两个索引数值引用工作表中的任一单元格,例如,rng(3,4)指定单元格D3。(By Chip Pearson)
------------------问题十一:在VBA代码中,如何引用当前工作表中的整行或整列? 回答:见下面的示例代码:
(1)Range(“C:C”).Select,表示选择C列。
Range(“C:E”).Select,表示选择C列至E列。(2)Range(“1:1”).Select,表示选择第一行。
Range(“1:3”).Select,表示选择第1行至第3行。(3)Range(“C:C”).EntireColumn,表示C列; Range(“D1”).EntireColumn,表示D列。
同样的方式,也可以选择整行,然后可以使用如AutoFit方法对整列或整行进行调整。
------------------问题十二:在VBA代码中,如何引用当前工作表中的所有单元格? 回答:可以使用下面的代码:
(1)Cells,表示当前工作表中的所有单元格。
(2)Range(Cells(1, 1), Cells(Cells.Rows.Count, Cells.Columns.Count)),其中Cells.Rows表示工作表所有行,Cells.Columns表示工作表所有列。
------------------问题十三:在VBA代码中,如何引用工作表中的特定单元格区域?
回答:在工作表中,您可能使用过“定位条件”对话框。可以通过选择菜单“编辑——定位”,单击“定位”对话框中的“定位条件”按钮显示该对话框。这个对话框可以允许用户选择特定的单元格。例如:
(1)Worksheets(“sheet1”).Cells.SpecialCells(xlCellTypeAllFormatConditions),表示工作表sheet1中由带有条件格式的单元格所组成的区域。(2)ActiveCell.CurrentRegion.SpecialCells(xlCellTypeBlanks),表示当前工作表中活动单元格所在区域中所有空白单元格所组成的区域。
当然,还有很多常量和值的组合,可以让您实现特定单元格的查找并引用。参见《探讨在工作表中找到最后一行》一文。------------------问题十四:在VBA代码中,如何引用其它工作表或其它工作簿中的单元格区域?
回答:要引用其它工作表或其它工作簿中的单元格区域,只需在单元格对象前加上相应的引用对象即可,例如:
(1)Worksheets(“Sheet3”).Range(“C3:D5”),表示引用工作表sheet3中的单元格区域C3:D5。(2)Workbooks(“MyBook.xls”).Worksheets(“sheet1”).Range(“B2”),表示引用MyBook工作簿中工作表Sheet1上的单元格B2。
------------------问题十五:还有其它的一些情形吗? 回答:列举如下:
(1)Cells(15),表示单元格O1,即可在Cells属性中指定单元格数字来选择单元格,其计数顺序为自左至右、从上到下,又如Cells(257),表示单元格B1。
(2)Cells(, 256),表示单元格IV1,但是如果Cells(, 257),则会返回错误。
------------------结语
我们用VBA对Excel进行处理,一般是对其工作表中的数据进行处理,因此,引用单元格区域是ExcelVBA编程中最基本的操作之一,只有确定了所处理的单元格区域,才能使用相应的属性和方法进行下一步的操作。
上面列举了一些引用单元格区域的情形和方式,可以看出,引用单元格区域有很多方式,有一些可能不常用,可以根据工作表的所处的环境和个人编程习惯进行选择使用。
当然,在编写程序时,也可能会将上面的一些属性联合使用,以达到选取特定操作对象的目的,例如Offset属性、Resize属性、CurrentRegion属性、UsedRange属性等的组合。
找到最后一行的一些方法探讨 使用End属性
在ExcelVBA中,使用End(xlUp)查找最后一行是最常使用且最为简单的方法,它假设要有一列总包含有数据(数字、文本和公式等),并且在该列中最后输入数据的单元格的下一行不会包含数据,因此不必担心会覆盖掉已有数据。但该方法有两个缺点:(1)仅局限于查找指定列的最后一行。
(2)如果该列中最后一行被隐藏,那么该隐藏行将被视作最后一行。因此,在最后一行被隐藏时,其数据可能会被覆盖。但该列中间的隐藏行不会影响查找的结果。[示例代码01] Sub EndxlUp_OneColLastRow()If Range(“A” & Rows.Count).End(xlUp)= Empty Then GoTo Finish '获取最后一行
MsgBox “最后一行是第” & Range(“A” & Rows.Count).End(xlUp).Row & “行.” Exit Sub Finish: MsgBox “没有发现公式或数据!” End Sub [示例代码02] Sub NextRowInColumnUsedAsSub()'包含所有数据和公式,忽略隐藏的最后一行
Range(“A” & Range(“A” & Rows.Count).End(xlUp).Row 1).Select End Sub [示例代码03] Sub NextRowInColumnUsedAsFunction()'包含所有数据和公式,忽略隐藏的最后一行
Range(“A” & LastRowInColumn(“A”) 1).Select End Sub '-------Public Function LastRowInColumn(Column As String)As Long LastRowInColumn = Range(Column & Rows.Count).End(xlUp).Row End Function 注意,要输入新数据的列可能与我们所查找最后一行时所使用的列不同,例如,在上例中,我们可以修改为在B列中查找该列的最后一行,而在A列相应行的下一行中输入新的数据。
------------------使用Find方法
Find方法在当前工作有数据中进行查找,不需要指定列,也可以确保不会意外地覆盖掉已有数据。其中,参数LookIn指定所查找的类型,有三个常量可供选择,即xlValues、xlFormulas和xlComments。
(1)常量xlFormulas将包含零值的单元格作为有数据的单元格。(当设置零值不显示时,该单元格看起来为空,但该参数仍将该单元格视为有数据的单元格)(2)常量xlValues将包含零值的单元格(如果设置零值不显示时)作为空白单元格,此时,若该单元格在最后一行,则Find方法会认为该单元格所在的行为空行,因此,该单元格中的内容可能会被新数据所覆盖。
[注:在Excel中,选择菜单“工具”——“选项”,在打开的“选项”对话框中,选择“视图”选项卡,将其中的“零值”前的复选框取消选中,则工作表中的零值都不会显示] 如果在参数LookIn中使用常量xlValues的话,还存在一个问题是:如果您将最后一行隐藏,则Find方法会认为倒数第二行是最后一行,此时您在最后一行的下一行输入数据,则会将实际的最后一行的数据覆盖。
您可以在隐藏最后一行与不隐藏最后一行,或者是最后一行显示零值与不显示零值时,运行下面的示例代码04,看看所得的结果有什么不同。[示例代码04] Sub Find_LastRowxlValues()On Error GoTo Finish '获取最后一行
MsgBox “最后一行是第” & Cells.Find(“*”, _ SearchOrder:=xlByRows, LookIn:=xlValues, _ SearchDirection:=xlPrevious).EntireRow.Row & “行” Exit Sub Finish: MsgBox “没有发现数值!” End Sub 因此,在使用Find方法时,您应该考虑所选参数设置的常量,以及工作表最后一行是否有可能被隐藏或不显示零值。如果您忽视这些情况,很可能得不到您想要的结果,或者是覆盖掉已有数据。使用常量xlFormulas可以避免这个问题,如下面的示例代码05所示。[示例代码05] Sub Find_LastRowxlFormulas()On Error GoTo Finish '获取最后一行
MsgBox “最后一行是第” & Cells.Find(“*”, _ SearchOrder:=xlByRows, LookIn:=xlFormulas, _ SearchDirection:=xlPrevious).EntireRow.Row & “行” Exit Sub Finish: MsgBox “没发现数值或公式!” End Sub 下面再列举几个示例代码。[示例代码06] Sub NextRowUsedAsSub()'选取最后一行的下一行 Range(“A” & Cells.Find(“*”, LookIn:=xlFormulas, SearchDirection:=xlPrevious).Row 1).Select End Sub [示例代码07] Sub NextRowUsedAsFunction()'选取最后一行的下一行(调用函数)Range(“A” & LastRow 1).Select End Sub '-------Public Function LastRow()As Long '本代码包含隐藏行
'使用常量xlFormulas,因为常量xlValues会忽略隐藏的最后一行 LastRow = Cells.Find(“*”, LookIn:=xlFormulas, SearchDirection:=xlPrevious).Row End Function 注:Find方法中,参数LookIn的默认值为xlFormulas。
------------------使用SpecialCells方法
SpecialCells方法用于查找指定类型的值,其语法为SpecialCells(Type,Value),有两种主要的使用方式:
(1)若参数Type仅考虑常量,则在查找时会忽略和覆盖由公式生成的任何数据,如示例代码08所示。
(2)若参数Type仅考虑由公式生成的数据,则在查找时会忽略和覆盖任何常量数据,如示例代码09所示。如果参数Type是xlCellTypeConstants或者是xlCellTypeFormulas,则Value参数可使用常量决定哪种类型的单元格将被包含在结果中,这些常量值能组合而返回多个类型,其缺省设置是选择所有的常量或公式,而不管是何类型,可使用下面四个可选的常量: 1)xlTextValues(包含文本);2)xlNumbers(包含数字);3)xlErrors(包含错误值);4)xlLogical(包含逻辑值)自已在工作表输入一些含有数值和公式的数据,隐藏或不隐藏最后一行或公式所在的行,先体验下面的两段示例代码。[示例代码08] '当最后一行为公式或隐藏了最后行时,会忽略,即认为倒数第二行为最后一行 Sub NextConstantRowFunction()Range(“A” & LastConstantRow(True, True, True, True) 1).Select End Sub '------Public Function LastConstantRow(Optional IncludeText As Boolean, _ Optional IncludeNumbers As Boolean, _ Optional IncludeErrors As Boolean, _ Optional IncludeLogicals As Boolean)As Long Dim Text As Long, Numbers As Long, Errors As Long Dim Logical As Long, AllTypes As Long If IncludeText Then Text = xlTextValues Else Text = 0 If IncludeNumbers Then Numbers = xlNumbers Else Numbers = 0 If IncludeErrors Then Errors = xlErrors Else Errors = 0 If IncludeLogicals Then Logical = xlLogical Else Logical = 0 AllTypes = Text Numbers Errors Logical On Error GoTo Finish LastConstantRow = Split(Cells.SpecialCells(xlCellTypeConstants, AllTypes).Address, “$”)_(UBound(Split(Cells.SpecialCells(xlCellTypeConstants, AllTypes).Address, “$”)))Exit Function Finish: MsgBox “没有发现数据!” End Function [示例代码09] '查找含有公式的单元格所在的行,忽略该行以后的常量和隐藏的行 Sub NextFormulaRowFunction()Range(“A” & LastFormulaRow(True, True, True, True) 1).Select End Sub '-------Public Function LastFormulaRow(Optional IncludeText As Boolean, _ Optional IncludeNumbers As Boolean, _ Optional IncludeErrors As Boolean, _ Optional IncludeLogicals As Boolean)As Long Dim Text As Long, Numbers As Long, Errors As Long Dim Logical As Long, AllTypes As Long If IncludeText Then Text = xlTextValues Else Text = 0 If IncludeNumbers Then Numbers = xlNumbers Else Numbers = 0 If IncludeErrors Then Errors = xlErrors Else Errors = 0 If IncludeLogicals Then Logical = xlLogical Else Logical = 0 AllTypes = Text Numbers Errors Logical On Error GoTo Finish LastFormulaRow = Split(Cells.SpecialCells(xlCellTypeFormulas, AllTypes).Address, “$”)_(UBound(Split(Cells.SpecialCells(xlCellTypeFormulas, AllTypes).Address, “$”)))Exit Function Finish: MsgBox “没有发现数据!” End Function 下面的示例代码10忽略最后一行带有公式的单元格,即当最后一行的单元格中含有公式时,将倒数第二行作为最后一行,即只考虑直接输入到工作表中的数据。当最后一行没有公式但被隐藏时,并不影响该方法的判断。[示例代码10] Sub SpecialCells_LastRowxlCellTypeConstants()Dim MyRow As Range On Error GoTo Finish Set MyRow = Intersect([A:A], Cells._ SpecialCells(xlCellTypeConstants).EntireRow).EntireRow '获取最后一行
MsgBox “最后一行是第” & Split(MyRow.Address, “$”)_(UBound(Split(MyRow.Address, “$”)))& “行” Set MyRow = Nothing Exit Sub Finish: MsgBox “没有发现数据!” End Sub 注:因为上述代码使用了’Split’函数,故只适合于Office2000及以上的版本。该方法也允许我们指定单个数据类型,诸如数字数据或文本数据,如下所示。
下面,我们查找的最后一行是仅在行中有数字(而不包含公式)的单元格的最后一行。[示例代码11] Sub SpecialCells_LastRowxlCellTypeNumberConstants()Dim MyRow As Range On Error GoTo Finish Set MyRow = Intersect([A:A], Cells._ SpecialCells(xlCellTypeConstants, xlNumbers).EntireRow)'获取最后一行
MsgBox “最后一行是第” & Split(MyRow.Address, “$”)_(UBound(Split(MyRow.Address, “$”)))& “行” Set MyRow = Nothing Exit Sub Finish: MsgBox “没有发现数据!” End Sub 下面,我们查找的最后一行是仅在行中有文本(而不包含公式)的单元格的最后一行。[示例代码12] Sub SpecialCells_LastRowxlCellTypeTextConstants()Dim MyRow As Range On Error GoTo Finish Set MyRow = Intersect([A:A], Cells._ SpecialCells(xlCellTypeConstants, xlTextValues).EntireRow)'获取最后一行
MsgBox “最后一行是第” & Split(MyRow.Address, “$”)_(UBound(Split(MyRow.Address, “$”)))& “行” Set MyRow = Nothing Exit Sub Finish: MsgBox “没有发现数据!” End Sub 下面,我们查找的最后一行是仅在行中有公式的单元格的最后一行。[示例代码13] Sub SpecialCells_LastRowxlCellTypeFormulas()Dim MyRow As Range On Error GoTo Finish Set MyRow = Intersect([A:A], Cells._ SpecialCells(xlCellTypeFormulas).EntireRow).EntireRow '获取最后一行
MsgBox “最后一行是第” & Split(MyRow.Address, “$”)_(UBound(Split(MyRow.Address, “$”)))& “行” Set MyRow = Nothing Exit Sub Finish: MsgBox “没有发现数据!” End Sub 同上面所讲述的一样,我们也能使用SpecailCells方法去找到其它特定类型的单元格所在的最后一行,下面是这些常量的一个完整的列表:
XlCellTypeAllFormatConditions(任何格式的单元格)XlCellTypeAllValidation(带有数据有效性的单元格)XlCellTypeBlanks(所使用区域中的空白单元格)XlCellTypeComments(包含有批注的单元格)XlCellTypeConstants(包含有常量的单元格)XlCellTypeFormulas(包含有公式的单元格)XlCellTypeLastCell(已使用区域中的最后一个单元格(看下面))XlCellTypeSameFormatConditions(有相同格式的单元格)XlCellTypeSameValidation(有相同数据有效性条件的单元格)XlCellTypeVisible(工作表中所有可见的单元格)
第四篇:建筑中有关数据
一、砖混结构:
1、水泥用量160Kg/㎡
2、用砖量140-160块/㎡
3、钢筋用量18-20Kg/㎡
4、外墙抹灰面积=0.7-1倍建筑面积
5、内墙抹灰面积=1.7倍建筑面积
6、室内抹灰面积=3-3.4倍建筑面积7、240砖墙 529块/m3;370砖墙 522块/m3;490砖墙 518块/m3;120砖墙 552块/m3;180砖墙 539块/m3;60砖墙 606块/m38、外墙瓷砖面积=0.3-0.33倍建筑面积
二、工程造价:
1、砖混结构:620-630元/㎡
2、框架结构:900-1100元/㎡
3、底框结构:650-680元/㎡
4、剪力墙结构:1200元/㎡
5、短肢剪力墙结构:860-900元/㎡
6、厂房框架:1300元/㎡
7、别墅:1000-1200元/㎡
8、办公楼框架:1300-1500元/㎡
三、水泥地面抹灰3㎡/袋
四、框架结构:
1、水泥用量175-190Kg/㎡
2、用砖量110-130块/㎡
3、钢筋用量35-40Kg/㎡;公共建筑50-60Kg/㎡:厂房:70Kg/㎡
4、外墙抹灰0.7-0.9建筑面积
5、内墙抹灰面积=1.7倍建筑面积
6、粘灰面积=2倍建筑面积
五、损耗
外墙瓷砖:横贴20-25%;竖贴10-15%;
六、配合比
C10配合比1:3.97:4.66:0.85 水泥用量235Kg/m3
C15配合比1:1.769:3.76:0.49水泥用量325Kg/m3泵送
C20配合比1:2.08:3.69:0.58水泥用量330Kg/m32:4:6
C25配合比1:1.74:3.23:0.47水泥用量373Kg/m32:3:5
C30配合比1:1.48:2.76:0.41水泥用量424Kg/m32:2:42:1:2
C35配合比1:1.67:3.25:0.44水泥用量398Kg/m32;:2:342.5水泥
第五篇:在VBA代码中引用Excel工作表中单元格区域的方式小结
在VBA代码中引用Excel工作表中单元格区域的方式小结
-----------------Public Function LastUsedRow()As Long LastUsedRow = Cells.SpecialCells(xlCellTypeLastCell).Row End Function 使用这里介绍的两种技术时,您一定要清楚工作表当前的状态,以找到正确的最后一行。
------------------使用CurrentRegion属性
CurrentRegion属性返回代表单元格所在的当前区域,即四周有空行的独立区域,因此,可使用此属性查找当前区域的最后一行。但是使用其查找最后一行的一个缺点是,必须首先选取当前区域,然后进行查找。
------------------小结
正如开始所讲述的一样,使用各种方法来查找最后一行都有其优缺点,并且都能找到您想要的最后一行,关键是您要了解各种方法的特性,以及工作表的状态,以便于选择所使用的方法来找到您需要的最后一行。
上述内容可能有不准确的地方,也可能有遗漏之处,您也可以在调试中体会和改进。
使用 Visual Basic 的普通任务是指定单元格或单元格区域,然后对该单元格或单元格区域进行一些操作,如输入公式或更改格式。
通常用一条语句就能完成操作,该语句可标识单元格,还可更改某个属性或应用某个方法。
在 Visual Basic 中,Range 对象既可表示单个单元格,也可表示单元格区域。下列主题说明了标识和处理 Range 对象最常用的方法。
用 A1 样式记号引用单元格和单元格区域
可使用 Range 属性来引用 A1 引用样式中的单元格或单元格区域。下述子程序将单元格区域 A1:D5 的字体设置为加粗。
Sub FormatRange()Workbooks(“Book1”).Sheets(“Sheet1”).Range(“A1:D5”)_.Font.Bold = True End Sub
下表演示了使用 Range 属性的一些 A1 样式引用。
引用
含义
Range(“A1”)单元格 A1
Range(“A1:B5”)从单元格 A1 到单元格 B5 的区域
Range(“C5:D9,G9:H16”)多块选定区域
Range(“A:A”)A 列
Range(“1:1”)第一行
Range(“A:C”)从 A 列到 C 列的区域
Range(“1:5”)从第一行到第五行的区域
Range(“1:1,3:3,8:8”)第 1、3 和 8 行
Range(“A:A,C:C,F:F”)A、C 和 F 列
用编号引用单元格
通过使用行列编号,可用 Cells 属性来引用单个单元格。该属性返回代表单个单元格的 Range 对象。下例中,Cells(6,1)返回 Sheet1 上的单元格 A6,然后将 Value 属性设置为 10。Sub EnterValue()Worksheets(“Sheet1”).Cells(6, 1).Value = 10 End Sub 因为可用变量替代编号,所以 Cells 属性非常适合于在单元格区域中循环,如下例所示。
Sub CycleThrough()Dim Counter As Integer For Counter = 1 To 20 Worksheets(“Sheet1”).Cells(Counter, 3).Value = Counter Next Counter End Sub 注意 如果要同时更改某一单元格区域中所有单元格的属性或对其应用方法,可使用 Range 属性。有关详细信息,请参阅用 A1 样式记号引用单元格。
引用行和列
可用 Rows 属性或 Columns 属性来处理整行或整列。这两个属性返回代表单元格区域的 Range 对象。下例中,用 Rows(1)返回 Sheet1 上的第一行,然后将单元格区域的 Font 对象的 Bold 属性设置为 True。
Sub RowBold()Worksheets(“Sheet1”).Rows(1).Font.Bold = True End Sub 下表举例说明了使用 Rows 和 Columns 属性的一些行和列的引用。
引用
含义
Rows(1)第一行
Rows 工作表上所有的行
Columns(1)第一列
Columns(“A”)第一列
Columns 工作表上所有的列
若要同时处理若干行或列,请创建一个对象变量并使用 Union 方法,将对 Rows 属性或 Columns 属性的多个调用组合起来。下例将活动工作簿中第一张工作表上的第一行、第三行和第五行的字体设置为加粗。Sub SeveralRows()Worksheets(“Sheet1”).Activate Dim myUnion As Range Set myUnion = Union(Rows(1), Rows(3), Rows(5))myUnion.Font.Bold = True End Sub 用快捷记号引用单元格
可用方括号将 A1 引用样式或命名区域括起来,作为 Range 属性的快捷方式。这样就不必键入单词“Range”或使用引号,如下例所示。
Sub ClearRange()Worksheets(“Sheet1”).[A1:B5].ClearContents End Sub Sub SetValue()[MyRange].Value = 30 End Sub 引用命名区域
用名称比用 A1 样式记号更容易标识单元格区域。若要命名选定的单元格区域,请单击编辑栏左端的名称框,键入名称,再按 Enter。
引用命名区域
下例引用了名为“MyBook.xls”的工作簿中的名为“MyRange”的单元格区域。
Sub FormatRange()Range(“MyBook.xls!MyRange”).Font.Italic = True End Sub 下例引用名为“Report.xls”的工作簿中的特定工作表单元格区域“Sheet1!Sales”。
Sub FormatSales()Range(“[Report.xls]Sheet1!Sales”).BorderAround Weight:=xlthin End Sub 若要选定命名区域,请用 GoTo 方法,该方法将激活工作簿和工作表,然后选定该区域。
Sub ClearRange()Application.Goto Reference:=“MyBook.xls!MyRange” Selection.ClearContents End Sub 下例显示对于活动工作簿将如何编写相同的过程。
Sub ClearRange()Application.Goto Reference:=“MyRange” Selection.ClearContents End Sub 在命名区域中的单元格上循环
下例用 For Each...Next 循环语句在命名区域中的每一个单元格上循环。如果该区域中的任一单元格的值超过 limit 的值,就将该单元格的颜色更改为黄色。
Sub ApplyColor()Const Limit As Integer = 25 For Each c In Range(“MyRange”)If c.Value > Limit Then c.Interior.ColorIndex = 27 End If Next c End Sub 相对于其他单元格来引用单元格
处理相对于另一个单元格的某一单元格的常用方法是使用 Offset 属性。下例中,将位于活动工作表上活动单元格下一行和右边三列的单元格的内容设置为双下划线格式。
Sub Underline()ActiveCell.Offset(1, 3).Font.Underline = xlDouble End Sub 注意 可录制使用 Offset 属性(而不是绝对引用)的宏。在“工具”菜单上,指向“宏”,再单击“录制新宏”,然后单击“确定”,再单击录制宏工具栏上的“相对引用”按钮。
若要在单元格区域中循环,请在循环中将变量与 Cells 属性一起使用。下例以 5 为步长,用 5 到 100 之间的值填充第三列的前 20 个单元格。变量 counter 用作 Cells 属性的行号。
Sub CycleThrough()Dim counter As Integer For counter = 1 To 20 Worksheets(“Sheet1”).Cells(counter, 3).Value = counter * 5 Next counter End Sub 用 Range 对象引用单元格
如果将对象变量设置为 Range 对象,即可用变量名方便地操作单元格区域。
下述过程创建了对象变量 myRange,然后将活动工作簿中 Sheet1 上的单元格区域 A1:D5 赋予该变量。随后的语句用该变量代替该区域对象,以修改该区域的属性。
Sub Random()Dim myRange As Range Set myRange = Worksheets(“Sheet1”).Range(“A1:D5”)myRange.Formula = “=RAND()” myRange.Font.Bold = True End Sub 引用工作表上的所有单元格
如果对工作表应用 Cells 属性时不指定编号,该属性将返回代表工作表上所有单元格的 Range 对象。下述 Sub 过程清除活动工作簿中 Sheet1 上的所有单元格的内容。
Sub ClearSheet()Worksheets(“Sheet1”).Cells.ClearContents End Sub 引用多个单元格区域
使用适当的方法可以很容易地同时引用多个单元格区域。可用 Range 和 Union 方法引用任意组合的单元格区域;用 Areas 属性可引用工作表上选定的一组单元格区域。
使用 Range 属性
通过在两个或多个引用之间放置逗号,可使用 Range 属性来引用多个单元格区域。下例清除了 Sheet1 上三个单元格区域的内容。
Sub ClearRanges()Worksheets(“Sheet1”).Range(“C5:D9,G9:H16,B14:D18”)._ ClearContents End Sub 命名区域使得用 Range 属性处理多个单元格区域更为容易。下例可在三个命名区域处于同一工作表时运行。
Sub ClearNamed()Range(“MyRange, YourRange, HisRange”).ClearContents End Sub 使用 Union 方法
用 Union 方法可将多个单元格区域组合到一个 Range 对象中。下例创建了名为 myMultipleRange 的 Range 对象,并将其定义为单元格区域 A1:B2 和 C3:D4 的组合,然后将该组合区域的字体设置为加粗。
Sub MultipleRange()Dim r1, r2, myMultipleRange As Range Set r1 = Sheets(“Sheet1”).Range(“A1:B2”)Set r2 = Sheets(“Sheet1”).Range(“C3:D4”)Set myMultipleRange = Union(r1, r2)myMultipleRange.Font.Bold = True End Sub 使用 Areas 属性
可用 Areas 属性引用选定的单元格区域或多块选定区域中的区域集合。下述过程计算选定区域中的块数目,如果有多个块,就显示一则警告消息。Sub FindMultiple()If Selection.Areas.Count > 1 Then MsgBox “Cannot do this to a multiple selection.” End If End Sub 在VBA代码中引用Excel工作表中单元格区域的方式小结 2022年07月12日 星期四 上午 09:37 在VBA代码中引用Excel工作表中单元格区域的方式小结
分类:ExcelVBA>>ExcelVBA对象模型编程>>常用对象>>Range对象
在 使用ExcelVBA进行编程时,我们通常需要频繁地引用单元格区域,然后再使用相应的属性和方法对区域进行操作。所谓单元格区域,指的是单个的单元格、或者是由多个单元格组成的区域、或者是整行、整列等。下面,我们设定一些情形,以问答的形式对引用单元格区域的方式进行归纳。
问题一:在VBA代码中,如何引用当前工作表中的单个单元格(例如引用单元格C3)?
回答:可以使用下面列举的任一方式对当前工作表中的单元格(C3)进行引用。(1)Range(“C3”)(2)[C3](3)Cells(3, 3)(4)Cells(3, “C”)(5)Range(“C4”).Offset(-1)Range(“D3”).Offset(,-1)Range(“A1”).Offset(2, 2)(6)若C3为当前单元格,则可使用:ActiveCell(7)若将C3单元格命名为“Range1”,则可使用:Range(“Range1”)或[Range1](8)Cells(4, 3).Offset(-1)(9)Range(“A1”).Range(“C3”)
问题二:在VBA代码中,我要引用当前工作表中的B2:D6单元格区域,有哪些方式?
回答:可以使用下面列举的任一方式对当前工作表中单元格区域B2:D6进行引用。
(1)Range(“B2:D6”)(2)Range(“B2”, “D6”)(3)[B2:D6](4)Range(Range(“B2”), Range(“D6”))(5)Range(Cells(2, 2), Cells(6, 4))(6)若将B2:D6区域命名为“MyRange”,则又可以使用下面的语句引用该区域: ① Range(“MyRange”)② [MyRange]
(7)Range(“B2”).Resize(5, 3)(8)Range(“A1:C5”).Offset(1, 1)(9)若单元格B2为当前单元格,则可使用语句:Range(ActiveCell, ActiveCell.Offset(4, 2))(10)若单元格D6为当前单元格,则可使用语句:Range(“B2”, ActiveCell)
问题三:在VBA代码中,如何使用变量实现对当前工作表中不确定单元格区域的引用?
回答:有时,我们需要在代码中依次获取工作表中特定区域内的单元格,这通常可以采取下面的几种方式:(1)Range(“A” & i)
(2)Range(“A” & i & “:C” & i)(3)Cells(i,1)(4)Cells(i,j)其中,i、j为变量,在循环语句中指定i和j的范围后,依次获取相应单元格。
问题四:在VBA代码中,如何扩展引用当前工作表中的单元格区域? 回答:可以使用Resize属性,例如:
(1)ActiveCell.Resize(4, 4),表示自当前单元格开始创建一个4行4列的区域。
(2)Range(“B2”).Resize(2, 2),表示创建B2:C3单元格区域。(3)Range(“B2”).Resize(2),表示创建B2:B3单元格区域。(4)Range(“B2”).Resize(, 2),表示创建B2:C2单元格区域。如果是在一个单元格区域(如B3:E6),或一个命名区域中(如将单元格区域B3:E6命名为“MyRange”)使用Resize属性,则只是相对于单元格区域左上角单元格扩展区域,例如:
代码Range(“C3:E6”).Resize(, 2),表示单元格区域C3:D6,并且扩展的单元格区域可不在原单元格区域内。
因此,可以知道Resize属性是相对于当前活动单元格或某单元格区域中左上角单元格按指定的行数或列数扩展单元格区域。
问题五:在VBA代码中,如何在当前工作表中基于当前单元格区域或指定单元格区域处理其它单元格区域?
回答:可以使用Offset属性,例如:
(1)Range(“A1”).Offset(2, 2),表示单元格C3。
(2)ActiveCell.Offset(, 1),表示当前单元格下一列的单元格。(3)ActiveCell.Offset(1),表示当前单元格下一行的单元格。
(4)Range(“C3:D5”).Offset(, 1),表示单元格区域D3:E5,即将整个区域偏移一列。
从上面的代码示例可知,Offset属性从所指定的单元格开始按指定的行数和列数偏移,从而到达目的单元格,但偏移的行数和列数不包括指定单元格本身。
问题六:在VBA代码中,如何在当前工作表中引用交叉区域? 回答:可以使用Intersect方法,例如:
Intersect(Range(“C3:E6”), Range(“D5:F8”)),表示单元格区域D5:E6,即单元格区域C3:E6与D5:F8相重迭的区域。
问题七:在VBA代码中,如何在当前工作表中引用多个区域? 回答:
(1)可以使用Union方法,例如:
Union(Range(“C3:D4”), Range(“E5:F6”)),表示单元格区域C3:D4和E5:F6所组成的区域。
Union方法可以将多个非连续区域连接起来成为一个区域,从而可以实现对多个非连续区域一起进行操作。(2)也可以使用下面的代码:
Range(“C3:D4, E5:F6”)或[C3:D4, E5:F6] 注意:Range(“C3:D4”, “F5:G6”),表示单元格区域C3:G6,即将两个区域以第一个区域左上角单元格为起点,以第二个区域右下角单元格为终点连接成一个新区域。
同时,在引用区域后使用Rows属性和Columns属性时,注意下面代码的区别: ①Range(“C3:D4”, “F8:G10”).Rows.Count,返回的值为8;
②Range(“C3:D4,F8:G10”).Rows.Count,返回的值为2,即只计算第一个单元格区域。
问题八:在VBA代码中,如何引用当前工作表中活动单元格或指定单元格所在的区域(当前区域)?
回答:可以使用CurrentRegion属性,例如:
(1)ActiveCell.CurrentRegion,表示活动单元格所在的当前区域。(2)Range(“D5”).CurrentRegion,表示单元格D5所在的当前区域。当前区域是指周围由空行或空列所围成的区域。该属性的详细使用参见《CurrentRegion属性示例》一文。
问题九:在VBA代码中,如何引用当前工作表中已使用的区域? 回答:可以使用UsedRange属性,例如:
(1)Activesheet.UsedRange,表示当前工作表中已使用的区域。
(2)Worksheets(“sheet1”).UsedRange,表示工作表sheet1中已使用的区域。与CurrentRegion属性不同的是,该属性代表工作表中已使用的单元格区域,包括显示为空行,但已进行过格式的单元格区域。该属性的详细使用参见《解析UsedRange属性》一文。
问题十:如何在单元格区域内指定特定的单元格? 回答:可以使用Item属性,例如:
(1)Range(“A1:B10”).Item(5,3)指定单元格C5,这个单元格处于以区域中左上角单元格A1(即区域中第1行第1列的单元格)为起点的第5行第3列。因为Item属性为默认属性,因此也可以简写为:Range(“A1:B10”)(5,3)。
如果将A1:B10区域命名为”MyRange”,那么Range(“MyRange”)(5,3)也指定单元格C5。(2)Range(“A1:B10”)(12,13)指定单元格M12,即用这种方式引用单元格,该单元格不必一定要包含在区域内。
同时,也不需要索引数值是正值,例如: ① Range(“D4:F6”)(0,0)代表单元格C3; ② Range(“D4:F6”)(-1,-2)代表单元格A2。而Range(“D4:F6”)(1,1)代表单元格D4。(3)也可以在单元格区域中循环,例如:
Range(“D4:F6”)(2,2)(3,4)代表单元格H7,即该单元格位于作为左上角单元格E5的第3行第4列(因为E5是开始于区域中左上角单元格D4起的第2行第2列)。(4)也能使用一个单个的索引数值进行引用。计数方式为从左向右,即在区域中的第一行开始从左向右计数,第一行结束后,然后从第二行开始从左到右接着计数,依次 类推。(注:从区域中第一行第一个单元格开始计数,当第一行结束时,转入第二行最左边的单元格,这样按一行一行从左向右依次计数。以单元格区域中第1个单 元格开始,按上述规则依次为第2个单元格、第3个单元格„.等等),例如:
Range(“A1:B2”)(1)代表单元格A1; Range(“A1:B2”)(2)代表单元格B1; Range(“A1:B2”)(3)代表单元格A2; Range(“A1:B2”)(4)代表单元格B2。
这种方法可在工作表中连续向下引用单元格(即不一定是在单元格区域内,但在遵循相同的规律),例如:
Range(“A1:B2”)(5)代表单元格A3;
Range(“A1:B2”)(14)代表单元格B7,等等。也可以使用单个的负数索引值。
这种使用单个索引值的方法对遍历列是有用的,例如,Range(“D4”)(1)代表单元格D4,Range(“D4”)(2)代表单元格D5,Range(“D4”)(11)代表单元格D14,等等。
同理,稍作调整后也可遍历行,例如:
Range(“D4”).Columns(2)代表单元格E4,Range(“D4”).Columns(5)指定单元格H4,等等。
(5)当与对象变量配合使用时,Item属性能提供简洁并有效的代码,例如: Set rng = Worksheets(1).[a1] 定义了对象变量后,像单元格方法一样,Item属性允许使用两个索引数值引用工作表中的任一单元格,例如,rng(3,4)指定单元格D3。(By Chip Pearson)
问题十一:在VBA代码中,如何引用当前工作表中的整行或整列? 回答:见下面的示例代码:
(1)Range(“C:C”).Select,表示选择C列。
Range(“C:E”).Select,表示选择C列至E列。(2)Range(“1:1”).Select,表示选择第一行。
Range(“1:3”).Select,表示选择第1行至第3行。(3)Range(“C:C”).EntireColumn,表示C列; Range(“D1”).EntireColumn,表示D列。同样的方式,也可以选择整行,然后可以使用如AutoFit方法对整列或整行进行调整。
问题十二:在VBA代码中,如何引用当前工作表中的所有单元格? 回答:可以使用下面的代码:
(1)Cells,表示当前工作表中的所有单元格。
(2)Range(Cells(1, 1), Cells(Cells.Rows.Count, Cells.Columns.Count)),其中Cells.Rows表示工作表所有行,Cells.Columns表示工作表所有列。
问题十三:在VBA代码中,如何引用工作表中的特定单元格区域?
回答:在工作表中,您可能使用过“定位条件”对话框。可以通过选择菜单“编辑——定位”,单击“定位”对话框中的“定位条件”按钮显示该对话框。这个对话框可以允许用户选择特定的单元格。例如:(1)Worksheets(“sheet1”).Cells.SpecialCells(xlCellTypeAllFormatConditions),表示工作表sheet1中由带有条件格式的单元格所组成的区域。
(2)ActiveCell.CurrentRegion.SpecialCells(xlCellTypeBlanks),表示当前工作表中活动单元格所在区域中所有空白单元格所组成的区域。
当然,还有很多常量和值的组合,可以让您实现特定单元格的查找并引用。参见《探讨在工作表中找到最后一行》一文。
问题十四:在VBA代码中,如何引用其它工作表或其它工作簿中的单元格区域? 回答:要引用其它工作表或其它工作簿中的单元格区域,只需在单元格对象前加上相应的引用对象即可,例如:(1)Worksheets(“Sheet3”).Range(“C3:D5”),表示引用工作表sheet3中的单元格区域C3:D5。(2)Workbooks(“MyBook.xls”).Worksheets(“sheet1”).Range(“B2”),表示引用MyBook工作簿中工作表Sheet1上的单元格B2。
问题十五:还有其它的一些情形吗? 回答:列举如下:
(1)Cells(15),表示单元格O1,即可在Cells属性中指定单元格数字来选择单元格,其计数顺序为自左至右、从上到下,又如Cells(257),表示单元格B1。(2)Cells(, 256),表示单元格IV1,但是如果Cells(, 257),则会返回错误。
结语
我们用VBA对Excel进行处理,一般是对其工作表中的数据进行处理,因此,引用单元格区域是ExcelVBA编程中最基本的操作之一,只有确定了所处理的单元格区域,才能使用相应的属性和方法进行下一步的操作。上面列举了一些引用单元格区域的情形和方式,可以看出,引用单元格区域有很多方式,有一些可能不常用,可以根据工作表的所处的环境和个人编程习惯进行选择使用。
当然,在编写程序时,也可能会将上面的一些属性联合使用,以达到选取特定操作对象的目的,例如Offset属性、Resize属性、CurrentRegion属性、UsedRange属性等的组合。MsgBox 函数
作用:在对话框中显示消息,等待用户单击按钮,并返回一个 Integer 告诉用户单击哪一个按钮。语法:
MsgBox(prompt[, buttons] [, title] [, helpfile, context])参数说明:
MsgBox 函数的语法具有以下几个命名参数:
Prompt-------必需的。字符串表达式,作为显示在对话框中的消息。prompt 的最大长度大约为 1024 个字符,由所用字符的宽度决定。如果 prompt 的内容超过一行,则可以在每一行之间用回车符(Chr(13))、换行符(Chr(10))或是回车与换行符的组合(Chr(13)& Chr(10))将各行分隔开来。
Buttons-------可选的。数值表达式是值的总和,指定显示按钮的数目及形式,使用的图标样式,缺省按钮是什么以及消息框的强制回应等。如果省略,则 buttons 的缺省值为 0。Title-------可选的。在对话框标题栏中显示的字符串表达式。如果省略 title,则将应用程序名放在标题栏中。
Helpfile--------可选的。字符串表达式,识别用来向对话框提供上下文相关帮助的帮助文件。如果提供了 helpfile,则也必须提供 context。
Context-------可选的。数值表达式,由帮助文件的指定给适当的帮助主题的帮助上下文编号。如果提供了 context,则也必须提供 helpfile。
用于MsgBox函数中Button参数的常量 常量 值 说明 vbOKOnly 0 只显示“确定”按钮
VbOKCancel 1 显示“确定”和“取消”按钮
VbAbortRetryIgnore 2 显示“终止”、“重试”和“忽略” 按钮 VbYesNoCancel 3 显示“是”、“否”和“取消”按钮 VbYesNo 4 显示“是”和“否”按钮 VbRetryCancel 5 显示“重试”和“取消”按钮 VbCritical 16 显示“关键信息”图标 VbQuestion 32 显示“警告询问”图标 VbExclamation 48 显示“警告消息”图标 VbInformation 64 显示“通知消息”图标
vbDefaultButton1 0 第一个按钮是缺省值(缺省设置)vbDefaultButton2 256第二个按钮是缺省值 vbDefaultButton3 512第三个按钮是缺省值 vbDefaultButton4 768第四个按钮是缺省值
vbApplicationModal 0应用程序强制返回;应用程序一直被挂起,直到用户对消息框 作出响应才继续工作
vbSystemModal 4096系统强制返回;全部应用程序都被挂起,直到用户对消息框作 出响应才继续工作
vbMsgBoxHelpButton 16384将Help按钮添加到消息框 VbMsgBoxSetForeground 65536指定消息框窗口作为前景窗口 vbMsgBoxRight 524288文本为右对齐
vbMsgBoxRtlReading 1048576指定文本应为在希伯来和阿拉伯语系统中的从右到左显示 说明:
(1)第一组值(0–5)描述了消息框中显示的按钮的类型与数目;第二组值(16,32,48,64)描述了图标的样式;第三组值(0,256,512,768)说明哪一个按钮是缺省值;而第四组值(0,4096)则决定消息框的强制返回性。将这些数字相加以生成Buttons参数值的时候,只能由每组值取用一个数字。(2)这些常数都是 Visual Basic for Applications(VBA)指定的。结果,可以在程序代码中到处使用这些常数名称,而不必使用实际数值。实际数值与常数名称是等价的。返回值
用于MsgBox函数返回值的常量 常数 值 说明 vbOK 1 确定 vbCancel 2 取消 vbAbort 3 终止 vbRetry 4 重试 vbIgnore 5 忽略 vbYes 6 是 vbNo 7 否
(1)如果同时提供了Helpfile与Context参数,可以按F1键来查看与Context相应的帮助主题,Excel通常会在输入框中自动添加一个帮助(Help)按钮。
(2)若在消息框中显示“取消”按钮,则按下ESC键与单击“取消”按钮效果相同。若消息框中有“帮助”按钮,则提供相关的帮助信息。
(3)如果要输入多个参数并省略中间的某些参数,则必须在相应位置加入逗号分界符。示例
(1)(1)使用 MsgBox 函数,在具有“是”及“否”按钮的对话框中显示一条严重错误信息。示例中的缺省按钮为“否”,MsgBox函数的返回值视用户按哪一个钮而定。并假设DEMO.HLP为一帮助文件,其中有一个帮助主题代码为1000。
Dim Msg,Style,Title,Help,Ctxt,Response,MyString Msg=“Do you want to continue ?” ’定义消息文本
Style = vbYesNo vbCritical vbDefaultButton2 ' 定义按钮 Title = “MsgBox Demonstration” ' 定义标题文本 Help = “DEMO.HLP” ' 定义帮助文件 Ctxt = 1000 ' 定义帮助主题
Response = MsgBox(Msg, Style, Title, Help, Ctxt)If Response = vbYes Then ' 用户按下“是” MyString = “Yes” ' 完成某操作 Else ' 用户按下“否”
MyString = “No” ' 完成某操作 End If(2)只显示某消息 MsgBox “Hello!”
(3)将消息框返回的结果赋值给变量 Ans=MsgBox(“Continue?”,vbYesNo)
If MsgBox(“Continue?”,vbYesNo)<>vbYes Then Exit Sub(4)使用常量的组合,赋值组Config变量,并设置第二个按钮为缺省按钮 Config=vbYesNo vbQuestion vbDefaultButton2(5)若要在消息中强制换行,可在文本中使用vbCrLf(或vbNewLine)常量,用&加空格与字符隔开。如
MsgBox “This is the first line.” & vbNewLine & “Second line.”
(6)可以在消息框中使用vbTab常量插入一个制表符。下面的过程使用一个消息框来显示5×5单元格区域中的所有值,用vbTab常量分隔列并使用vbCrLf常量插入一个新行。注意在MsgBox函数最多只显示1024个字符,因此限制了可显示的单元格数。Option Explicit Sub ShowRangeValue()Dim Msg As String Dim r As Integer, c As Integer Msg = “" For r = 1 To 5 For c = 1 To 5 Msg = Msg & Cells(r, c)& vbTab Next c Msg = Msg & vbCrLf Next r MsgBox Msg End Sub(7)在消息框语句中运用工作表函数以及设置显示的数置格式,如下面语句所示:
MsgBox ” selection has “ & m & ” cells.“ & Chr(13)& ” the sum is :“ & Application.WorksheetFunction.Sum(Selection)& Chr(13)& ”the average is :“ & Format(Application.WorksheetFunction.Average(Selection), ”#,##0.00“), vbInformation, ”selection count & sum & average" & Chr(13)
版权声明:本站内容均由互联网用户自行上传分享,本网站不拥有所有权,不承担相关法律责任。如有涉嫌版权的内容,请发送邮件至:yunyingtm@163.com举报,并提供相关证据,一经查实,本站将立刻删除。