閬苑小生
2015-1-12 13:37:48
樓主
VBA編程代碼天天有(vba入門學(xué)習(xí)的好資料)
308
閬苑小生
樓主
推薦
- Sub 合并計(jì)算()
- Dim path$, wb As Worksheet, arr1(), filename$, k%
- Application.ScreenUpdating = False
- path = ThisWorkbook.path & '\' '取得當(dāng)前工作薄的路徑
- filename = Dir(path & '*.*') '利用dir函數(shù)取得 該文件路徑下的一個工作薄名稱
- Do '利用do loop語句就行循環(huán)
- If filename <> ThisWorkbook.Name Then '不能使它取得當(dāng)前工作薄的名稱不會出現(xiàn)第一個就是工作薄 就退出的情況
- Workbooks.Open path & filename '要合并計(jì)算的工作薄
- k = k 1 '打開一個就記一次數(shù)
- ReDim Preserve arr1(1 To k) '重新定義arr1,arr1是用來最后放完整路徑和數(shù)據(jù)的
- arr1(k) = ''' & path & '[' & filename & ']' & Sheets(1).Name & ''!r1c1:r' & Cells(Rows.Count, 1).End(xlUp).Row & 'c2'
- '每循環(huán)一次,就將完整路徑和數(shù)據(jù)裝入數(shù)組arr1 結(jié)構(gòu)為 完整的路徑 工作薄名 工作表 匯總的數(shù)據(jù)(必須用r1c1引用表示)
- ActiveWorkbook.Close '關(guān)閉活動工作薄,也就是前面循環(huán)打開的工作薄
- End If
- filename = Dir '再一次利用dir取得文件名,這次可以省略后面的路徑
- Loop While filename <> '' '退出do loop語句的條件,不為空
- '=======================以上都是取得所有的數(shù)據(jù)的完整路徑,并裝入一維數(shù)組arr1
- Range('a1').Consolidate arr1, xlSum, True, True '利用合并計(jì)算分類匯總,類似于基礎(chǔ)操作中的合并計(jì)算
- '第一參數(shù)是要計(jì)算的區(qū)域,是一個數(shù)組形式的文本字符串集合
- '第二參數(shù)只合并計(jì)算的類型,這里是求和xlsum,當(dāng)然還有求最值、均值等等
- '第三四參數(shù)指的是是否按首行首列計(jì)算,指是否存在行標(biāo)題和列標(biāo)題
- '第五參數(shù)這里省略,指的是不使用工作表鏈接
- '有興趣的朋友可用F1查看幫助
- Range('a1') = '姓名' '合并計(jì)算的小問題,合并計(jì)算的起始單元格,會是空格,要補(bǔ)上表頭
- Application.ScreenUpdating = True
- End Sub
- Sub 清空()
- Range('a:b').Clear
- End Sub<img src='http://www./forum.php?mod=image&aid=1180&size=300x300&key=33752bd53873b58e&nocache=yes&type=fixnone' border='0' aid='attachimg_1180' alt='' style='line-height: 1.5;'>
2015-2-3 22:11:46
閬苑小生
樓主
推薦
- Sub test()
- Dim x, s
- For x = 2 To Cells(Rows.Count, 1).End(xlUp).Row '從第二行開始求和
- s = s Cells(x, 1) '累加求和
- If s > 500 Then Cells(x - 1, 1).Offset(0, 1) = s - Cells(x, 1): x = x - 1: s = 0
- '要求的是求和的不能大于500,則進(jìn)行判斷,如果大于500,則將這個求和結(jié)果s減去這個單元格cells(x,1)的值賦給它上一個單元格的右側(cè)
- '此時x要減去1,繼續(xù)從大于500的那個單元格的上一行循環(huán),不然的話,會漏掉一行值
- 's需要?dú)w零,表示重新疊加求和
- If x = Cells(Rows.Count, 1).End(xlUp).Row Then Cells(x, 2) = s '這個表示將x同最后一行進(jìn)行比較判斷,在前面循環(huán)的時候這一行循環(huán)不到,不管前面是多少,這一行一定有一個匯總的結(jié)果
- Next x
- End Sub<img src='http://www./forum.php?mod=image&aid=1065&size=300x300&key=8bbdb523ea6d3520&nocache=yes&type=fixnone' border='0' aid='attachimg_1065' alt='' style='line-height: 1.5;'>
2015-1-31 11:02:02
閬苑小生
樓主
推薦
- Sub 字典和冒泡排序的結(jié)合求最大值()
- Dim arr, x&, dic, brr(), k&, rg As Range, t!
- t = Timer
- Set dic = CreateObject('scripting.dictionary')
- arr = Range('a1').CurrentRegion
- ReDim brr(1 To UBound(arr), 1 To 4) '定義一個數(shù)組,用來存放結(jié)果,最多數(shù)組arr一樣大
- For x = 2 To UBound(arr) '循環(huán)整個數(shù)組區(qū)域
- If Not dic.exists(arr(x, 2)) Then '判斷的依據(jù)是第二列的名稱
- k = k 1
- dic(arr(x, 2)) = k '將k作為條目裝入字典之中
- brr(k, 1) = arr(x, 1)
- brr(k, 2) = arr(x, 2)
- brr(k, 3) = arr(x, 3)
- brr(k, 4) = arr(x, 4)
- '=====================上面這是不存在的情況,記一次數(shù),并把結(jié)果作為條目值裝入字典,用以確定每個名稱在brr中的結(jié)構(gòu),并把a(bǔ)rr對應(yīng)的結(jié)果裝土brr
- Else
- '=========以下是存在的情況
- If arr(x, 4) > brr(dic(arr(x, 2)), 4) Then '要求找出的是最大值,那么就用第4列的值同brr中已有的值進(jìn)行判斷,如果大于它,則需要把它裝入brr
- '如果小于它,則brr中的已經(jīng)滿足是最大值,不需要動它
- brr(dic(arr(x, 2)), 1) = arr(x, 1)
- brr(dic(arr(x, 2)), 2) = arr(x, 2)
- brr(dic(arr(x, 2)), 3) = arr(x, 3)
- brr(dic(arr(x, 2)), 4) = arr(x, 4) '把最大值的這4列分別裝入到結(jié)果數(shù)組brr之中
- End If
- End If
- Next x
- On Error Resume Next
- Set rg = Application.InputBox('請選擇要存放的區(qū)域所在的起始單元格', '提示', Type:=8) '利用inputbox 選擇存放的其實(shí)單元格
- If Err.Number <> 0 Then Exit Sub '這個是在沒有選擇區(qū)域下的情況
- rg.Resize(1, 4) = arr
- rg.Offset(1, 0).Resize(k, 4) = brr '讀出結(jié)果
- rg.Offset(0, 1).Resize(1, 4).EntireColumn.AutoFit
- MsgBox Format(Timer - t, '0.00s')
- End Sub<img src='http://www./forum.php?mod=image&aid=732&size=300x300&key=bb5efbcf1baf0f94&nocache=yes&type=fixnone' border='0' aid='attachimg_732' alt='' style='line-height: 1.5;'>
2015-1-25 10:41:47
cnpcwt
LV4
推薦
搶沙發(fā)!
2015-2-1 10:18:04
閬苑小生
樓主
推薦
- <span style='line-height: 1.5;'>Private Sub CommandButton1_Click()</span>
- Dim arr1, x&, k&, arr2()
- arr1 = Range('a1').CurrentRegion '將數(shù)據(jù)裝入arr1
- For x = 1 To UBound(arr1) '循環(huán)整個數(shù)組
- If arr1(x, 1) = Me.TextBox1.Value Then '如果數(shù)組里的值等于文本框里的值 則計(jì)數(shù)一次
- k = k 1
- ReDim Preserve arr2(1 To k) '重新定義動態(tài)數(shù)組
- arr2(k) = arr1(x, 2) '裝入數(shù)組arr2
- End If
- Next x
- If k = 0 Then MsgBox '單詞不存在': Exit Sub 'k=0 則表明 沒有對應(yīng)的詞組 彈出不存在的對話框
- Me.ListBox1.List = arr2 '將arr2的結(jié)果裝入列表框
- End Sub
- Private Sub UserForm_Terminate()
- 界面.Show '打開窗體界面
- End Sub
2015-3-27 16:56:32
閬苑小生
樓主
推薦
- Sub test()
- Dim path$, wbname, x%, y%
- Application.ScreenUpdating = False
- With Application.FileDialog(msoFileDialogFolderPicker) '會彈出一個選擇的對話框
- .Title = '請選擇要顯示的文件夾'
- If .Show = -1 Then
- path = .SelectedItems(1) & IIf(Right(.SelectedItems(1), 1) = '\', '', '\') '等于-1 則表明選擇了一個文件夾
- Else
- Exit Sub '不等于-1 則表明沒有選中文件夾 退出
- End If
- End With
- Sheets.Add '增加一個工作表
- [a1] = '工作薄': [b1] = '工作表' ' 分別寫入 工作薄 工作表 作為標(biāo)示
- wbname = Dir(path & '*.xls*') '取得目標(biāo)文件夾下的excel文件
- Do
- x = ActiveSheet.UsedRange.Rows.Count 1 '取得數(shù)據(jù)區(qū)域行數(shù)的最后一行 并加1
- ActiveSheet.Hyperlinks.Add Cells(x, 1), path & wbname, , wbname, wbname '添加一個超鏈接
- Workbooks.Open path & wbname '打開一個工作薄
- For y = 1 To Sheets.Count
- Workbooks(ThisWorkbook.Name).Sheets(1).Cells(x y, 2) = Sheets(y).Name '將工作表名 裝入到本工作薄的第二列
- Next y
- ActiveWorkbook.Close False '關(guān)閉
- wbname = Dir '再次利用dir取工作薄名
- Loop While wbname <> ''
- Application.ScreenUpdating = True
- End Sub
2015-3-26 12:42:40
晨風(fēng)
LV6
推薦
好的,先收藏,感謝分享
2015-3-11 10:59:29
閬苑小生
樓主
推薦
- Sub test()
- Dim reg, arr1, x%, arr2(), k%
- arr1 = Range('a1').CurrentRegion
- ReDim arr2(1 To UBound(arr1), 1 To 1) '定義一個同數(shù)據(jù)源區(qū)域一樣大的數(shù)組arr2
- Set reg = CreateObject('vbscript.regexp') '創(chuàng)建一個正則
- reg.Pattern = '[a-zA-Z]*\d ' '正則的匹配規(guī)則,表示是任意多個字母(從0到n)和至少一個數(shù)字的結(jié)構(gòu)
- For x = 2 To UBound(arr1) '循環(huán)數(shù)組arr1
- k = k 1 '計(jì)數(shù),作為數(shù)組arr2的結(jié)構(gòu)判斷,也可以直接用x
- arr2(k, 1) = reg.Execute(arr1(x, 4))(0) & '-' & reg.Execute(arr1(x, 5))(0) '把兩列的內(nèi)容分別用正則,由于只有一個合適的結(jié)果,直接取0就可以了
- Next x
- [g2].Resize(k, 1) = arr2 '讀出結(jié)果
- End Sub
2015-2-25 10:06:04
閬苑小生
樓主
推薦
- Sub 提取唯一值之刪除重復(fù)項(xiàng)法() '不支持Excel 2003
- With Range('c1:d' & Cells(Rows.Count, 1).End(xlUp).Row)
- .Value = Range('a1:b' & Cells(Rows.Count, 1).End(xlUp).Row).Value '將所有信息復(fù)制到C列放置結(jié)果區(qū)域,好對比
- .RemoveDuplicates Array(1, 2), xlYes '提取唯一值,表頭不參與計(jì)算
- '===== Range.RemoveDuplicates方法用于刪除區(qū)域中的重復(fù)值,其語法如下:
- '=====表達(dá)式.RemoveDuplicates(Columns, Header)
- '======第一參數(shù)表示包含重復(fù)信息的列的索引數(shù)組,如果沒有傳遞任何內(nèi)容,則假定所有列都包含重復(fù)信息。
- '======第二參數(shù)表示第一行是否包含標(biāo)題信息 可以按F1查看幫助
- End With
- End Sub
- Sub 提取唯一值之高級篩選法()
- '對A1到B列最后一個非空單元格執(zhí)行高級篩選,篩選時取唯一值,篩選結(jié)果存放在C1
- Range('a1:b' & Cells(Rows.Count, 1).End(xlUp).Row).AdvancedFilter xlFilterCopy, , Range('c1'), True
- '表達(dá)式.AdvancedFilter(Action, CriteriaRange, CopyToRange, Unique)
- 'Action 必選 XlFilterAction XlFilterAction 的常量之一,用于指定是否就地復(fù)制或篩選列表。
- 'CriteriaRange 可選 Variant 條件區(qū)域。如果省略該參數(shù),則沒有條件限制。
- 'CopyToRange 可選 Variant 如果 Action 為 xlFilterCopy,則為復(fù)制行的目標(biāo)區(qū)域。否則,忽略該參數(shù)。
- 'Unique 可選 Variant 如果為 True,則只篩選唯一記錄。如果為 False,則篩選符合條件的所有記錄。默認(rèn)值為 False。
- End Sub
- Sub 提取唯一值之字典法()
- Dim arr, dic, x&, brr, k&
- Set dic = CreateObject('scripting.dictionary')
- arr = Range('a1').CurrentRegion
- ReDim brr(1 To UBound(arr), 1 To 2)
- For x = 1 To UBound(arr)
- If Not dic.exists(arr(x, 1) & arr(x, 2)) Then '將兩列連接起來作為判斷的條件
- k = k 1
- dic(arr(x, 1) & arr(x, 2)) = '' '將它裝入字典
- brr(k, 1) = arr(x, 1)
- brr(k, 2) = arr(x, 2) '不重復(fù)的裝入到結(jié)果數(shù)組brr之中
- End If
- Next x
- [c1].Resize(k, 2) = brr
- End Sub
- Sub 清空()
- Range('c:d').Clear
- End Sub
經(jīng)過比較,在速度上 三者差別不是很大 幾萬數(shù)據(jù)都是不到0.1秒就可以解決 差別不明顯,在代碼的書寫上 高級篩選和刪除重復(fù)項(xiàng)要簡單的多,主體代碼就一句較為簡單,而字典的代碼相對較長,在實(shí)際運(yùn)用上,高級篩選和刪除重復(fù)項(xiàng)則應(yīng)用相對較為狹窄,只能處理少量的問題,遠(yuǎn)遠(yuǎn)沒有字典功能強(qiáng)大,字典與數(shù)組、正則等的結(jié)合會有強(qiáng)大的威力。強(qiáng)烈建議大家學(xué)習(xí)字典
2015-2-12 10:46:07
閬苑小生
樓主
推薦
- Sub 填充()
- Dim dic, x%, y%, z%, arr
- Range('a3:a1000').Clear
- Application.DisplayAlerts = False '合并單元格會彈窗提示,這個可以關(guān)閉
- Set dic = CreateObject('scripting.dictionary')
- Range('e3:e' & Cells(Rows.Count, 5).End(xlUp).Row).Copy [a3] '現(xiàn)將戶號復(fù)制到第一列
- For x = Cells(Rows.Count, 5).End(xlUp).Row To 3 Step -1 '利用倒循環(huán)的方法
- If Cells(x, 1) = Cells(x - 1, 1) Then
- Range(Cells(x, 1), Cells(x - 1, 1)).Merge '合并單元格的方法
- End If
- Next x
- '===========先將戶號相同的進(jìn)行單元格合并
- For y = 3 To Cells(Rows.Count, 5).End(xlUp).Row
- If Cells(y, 4) = '戶主' Then
- dic(Cells(y, 5).Value) = Cells(y, 3) '利用cells裝入字典的時候一定要加value,不然會默認(rèn)裝入單元格
- End If
- Next y
- '=====將戶號裝入字典之中,并裝入對應(yīng)的姓名,依據(jù)是等于“戶主”的
- For z = 3 To Cells(Rows.Count, 5).End(xlUp).Row
- If Cells(z, 1) <> '' Then Cells(z, 1) = dic(Cells(z, 1).Value) '將戶號替換為戶主姓名,利用字典進(jìn)行反讀條目值,這個類似于vlookup的作用
- Next z
- End Sub
- Sub 清空()
- Range('a3:a1000').Clear
- End Sub
|