色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

VBA數(shù)組篩選進(jìn)階:超越原生Filter,實(shí)現(xiàn)多條件、多模式與多維數(shù)組處理

VBA數(shù)組篩選進(jìn)階:超越原生Filter,實(shí)現(xiàn)多條件、多模式與多維數(shù)組處理 1. 項(xiàng)目概述從“能用”到“好用”的VBA數(shù)組篩選之路在VBA的日常開發(fā)里處理數(shù)組篩選是家常便飯。系統(tǒng)自帶的Filter函數(shù)用起來確實(shí)順手一句Filter(源數(shù)組, 匹配字符串, 包含, 比較模式)就能快速返回一個(gè)包含子串的結(jié)果數(shù)組。但用久了尤其是在處理稍微復(fù)雜點(diǎn)的數(shù)據(jù)清洗、報(bào)表生成或者自動(dòng)化核對任務(wù)時(shí)它的“脾氣”和“局限”就暴露無遺了。最讓人頭疼的莫過于它只能進(jìn)行基于字符串的“模糊包含”匹配你想按精確相等、數(shù)值范圍、多條件“與/或”邏輯來篩對不起Filter函數(shù)攤攤手表示辦不到。另一個(gè)坑是它的返回結(jié)果永遠(yuǎn)是一維的字符串?dāng)?shù)組如果你的源數(shù)據(jù)是二維的或者里面混著數(shù)字、日期Filter要么報(bào)錯(cuò)要么給你轉(zhuǎn)成字符串后續(xù)處理起來非常別扭。所以當(dāng)項(xiàng)目里又一次因?yàn)镕ilter無法實(shí)現(xiàn)“篩選出金額大于1000且部門為‘銷售部’的記錄”而不得不寫一長串循環(huán)時(shí)我決定不再將就。這次的目標(biāo)很明確自己動(dòng)手寫一個(gè)能完全模仿Filter基礎(chǔ)功能同時(shí)又能突破其核心局限的自定義函數(shù)。它不僅要能處理Filter能做的字符串包含篩選更要搞定Filter做不了的精確匹配、多條件、非字符串?dāng)?shù)據(jù)類型、多維數(shù)組篩選。這不僅僅是再造一個(gè)輪子而是打造一個(gè)更適應(yīng)復(fù)雜現(xiàn)實(shí)場景的“瑞士軍刀”。2. 核心需求與設(shè)計(jì)思路拆解2.1 深入剖析原生Filter函數(shù)的“阿喀琉斯之踵”在動(dòng)手之前必須先把標(biāo)準(zhǔn)Filter函數(shù)的局限性摸透這樣才能有的放矢。它的局限主要體現(xiàn)在四個(gè)方面匹配模式單一且不可控這是最根本的局限。Filter函數(shù)本質(zhì)上是一個(gè)“字符串包含”篩選器。它的Match參數(shù)必須是一個(gè)字符串函數(shù)的行為就是在源數(shù)組的每個(gè)元素中查找是否包含這個(gè)字符串。你無法將其改為“等于”、“以...開頭”、“以...結(jié)尾”或“正則表達(dá)式匹配”。例如你想從數(shù)組[“蘋果”, “香蕉”, “葡萄”]中精確找出“蘋果”用Filter(arr, “蘋果”, True, vbTextCompare)會(huì)把包含“蘋果”字的都找出來如果存在“紅蘋果”也會(huì)被選中而這往往不是我們想要的。數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換與丟失Filter的輸入數(shù)組和輸出數(shù)組都被強(qiáng)制限定為字符串類型Variant/String。如果你傳入一個(gè)包含數(shù)字、日期、布爾值的數(shù)組VBA會(huì)隱式地將它們?nèi)哭D(zhuǎn)換為字符串再進(jìn)行匹配。這會(huì)導(dǎo)致兩個(gè)問題一是精度可能丟失例如數(shù)字123.456可能變成“123.456”二是匹配邏輯變得詭異。比如你想從[123, 234, 345]中篩選出包含“23”的元素Filter會(huì)返回[123, 234]但這本質(zhì)是在字符串“123”和“234”中查找“23”而非數(shù)值比較。更麻煩的是輸出結(jié)果是一個(gè)一維字符串?dāng)?shù)組原始的數(shù)據(jù)類型信息徹底丟失給后續(xù)計(jì)算帶來隱患。無法處理多維數(shù)組Filter函數(shù)只接受一維數(shù)組作為輸入。在實(shí)際業(yè)務(wù)中我們經(jīng)常從Excel的Range.Value屬性直接得到一個(gè)二維數(shù)組或者自己構(gòu)建多維數(shù)組來存儲(chǔ)表格數(shù)據(jù)。面對這樣的數(shù)據(jù)源Filter函數(shù)會(huì)直接拋出“類型不匹配”或“下標(biāo)越界”的錯(cuò)誤迫使開發(fā)者必須先通過循環(huán)將其展平為一維篩選后再重組過程繁瑣且低效。多條件篩選能力缺失現(xiàn)實(shí)場景中的篩選很少是單條件的。Filter函數(shù)一次只能接受一個(gè)匹配字符串和一個(gè)是否包含的邏輯。要實(shí)現(xiàn)“條件A與條件B”或者“條件A或條件B”必須多次調(diào)用Filter并進(jìn)行數(shù)組間的交集或并集操作代碼會(huì)變得冗長且難以維護(hù)。2.2 自定義函數(shù)SuperFilter的頂層設(shè)計(jì)基于以上痛點(diǎn)我設(shè)計(jì)的自定義函數(shù)SuperFilter需要實(shí)現(xiàn)以下核心目標(biāo)功能目標(biāo)兼容模式完全復(fù)刻原生Filter函數(shù)的所有參數(shù)和功能作為保底選項(xiàng)。擴(kuò)展模式提供多種匹配模式精確、開頭、結(jié)尾、包含、正則支持?jǐn)?shù)值/日期等非字符串類型的直接比較。多條件支持允許傳入一個(gè)條件數(shù)組并指定條件間的邏輯關(guān)系A(chǔ)ND 或 OR。多維數(shù)組支持能夠直接處理二維數(shù)組并可以指定按行篩選還是按列篩選返回一個(gè)結(jié)構(gòu)保持的二維子數(shù)組。數(shù)據(jù)類型保持輸出數(shù)組的元素?cái)?shù)據(jù)類型盡量與輸入數(shù)組對應(yīng)元素保持一致。接口設(shè)計(jì)Function SuperFilter(SourceArray As Variant, _ Match As Variant, _ Optional Include As Boolean True, _ Optional Compare As VbCompareMethod vbBinaryCompare, _ Optional MatchMode As String “contains”, _ Optional ConditionLogic As String “AND”, _ Optional Dimension As Long 1) As VariantSourceArray: 源數(shù)組接受一維或二維Variant數(shù)組。Match: 匹配條件。可以是單個(gè)值字符串、數(shù)字、日期等也可以是一個(gè)一維條件數(shù)組。Include: 是否包含。True返回匹配項(xiàng)False返回不匹配項(xiàng)與Filter一致。Compare: 字符串比較模式vbBinaryCompare區(qū)分大小寫或vbTextCompare不區(qū)分。MatchMode: 匹配模式??蛇x“exact”精確、“startswith”開頭、“endswith”結(jié)尾、“contains”包含默認(rèn)、“regex”正則表達(dá)式。ConditionLogic: 當(dāng)Match為數(shù)組時(shí)條件間的邏輯。“AND”所有條件都滿足或“OR”任一條件滿足。Dimension: 對二維數(shù)組的篩選維度。1表示按行篩選返回符合條件的整行2表示按列篩選。內(nèi)部邏輯流程輸入驗(yàn)證與初始化檢查SourceArray是否是數(shù)組判斷其維數(shù)。根據(jù)維數(shù)和Dimension參數(shù)確定循環(huán)遍歷的方式是遍歷行還是列。條件預(yù)處理將Match參數(shù)統(tǒng)一處理為一個(gè)條件數(shù)組condArr()并確定匹配模式MatchMode。如果是多條件需明確ConditionLogic。核心遍歷與匹配判斷遍歷源數(shù)組的每一個(gè)目標(biāo)元素可能是一行、一列或一個(gè)單元素。對每個(gè)元素根據(jù)MatchMode調(diào)用對應(yīng)的匹配判斷函數(shù)并結(jié)合ConditionLogic計(jì)算最終是否匹配。結(jié)果收集與數(shù)組構(gòu)建動(dòng)態(tài)收集所有匹配項(xiàng)的索引。遍歷結(jié)束后根據(jù)收集的索引從源數(shù)組中提取對應(yīng)元素/行/列構(gòu)建一個(gè)新的、結(jié)構(gòu)正確的Variant數(shù)組作為結(jié)果返回。錯(cuò)誤處理在整個(gè)過程中加入必要的錯(cuò)誤捕獲例如無效的匹配模式、維度參數(shù)錯(cuò)誤、正則表達(dá)式編譯失敗等并返回一個(gè)可識(shí)別的錯(cuò)誤值如Empty數(shù)組或拋出描述性錯(cuò)誤。3. 核心細(xì)節(jié)解析與關(guān)鍵技術(shù)實(shí)現(xiàn)3.1 多模式匹配引擎的實(shí)現(xiàn)這是SuperFilter函數(shù)的核心也是與原生Filter最大的區(qū)別。我們需要一個(gè)統(tǒng)一的判斷函數(shù)它能根據(jù)MatchMode參數(shù)采用不同的邏輯進(jìn)行比較。首先定義一個(gè)內(nèi)部幫助函數(shù)IsMatchPrivate Function IsMatch(ByVal SourceValue As Variant, _ ByVal ConditionValue As Variant, _ ByVal MatchMode As String, _ ByVal CompareMethod As VbCompareMethod) As Boolean ‘ 處理空值情況 If IsEmpty(SourceValue) Or IsEmpty(ConditionValue) Then IsMatch False Exit Function End If Dim srcStr As String, condStr As String Dim regex As Object On Error GoTo ErrorHandler Select Case LCase(Trim(MatchMode)) Case “exact” ‘精確匹配 If VarType(SourceValue) vbString And VarType(ConditionValue) vbString Then IsMatch (StrComp(SourceValue, ConditionValue, CompareMethod) 0) Else ‘ 非字符串類型使用等號(hào)直接比較注意Variant的比較方式 IsMatch (SourceValue ConditionValue) End If Case “startswith” ‘開頭匹配 srcStr CStr(SourceValue) condStr CStr(ConditionValue) If CompareMethod vbTextCompare Then IsMatch (InStr(1, srcStr, condStr, vbTextCompare) 1) Else IsMatch (Left(srcStr, Len(condStr)) condStr) End If Case “endswith” ‘結(jié)尾匹配 srcStr CStr(SourceValue) condStr CStr(ConditionValue) If CompareMethod vbTextCompare Then ‘ 通過StrComp比較末尾部分稍微復(fù)雜一點(diǎn) IsMatch (StrComp(Right(srcStr, Len(condStr)), condStr, CompareMethod) 0) Else IsMatch (Right(srcStr, Len(condStr)) condStr) End If Case “contains” ‘包含匹配 (模擬原生Filter) srcStr CStr(SourceValue) condStr CStr(ConditionValue) IsMatch (InStr(1, srcStr, condStr, CompareMethod) 0) Case “regex” ‘正則表達(dá)式匹配 Set regex CreateObject(“VBScript.RegExp”) regex.Pattern CStr(ConditionValue) regex.IgnoreCase (CompareMethod vbTextCompare) regex.Global False IsMatch regex.Test(CStr(SourceValue)) Set regex Nothing Case Else ‘ 默認(rèn)使用包含匹配 srcStr CStr(SourceValue) condStr CStr(ConditionValue) IsMatch (InStr(1, srcStr, condStr, CompareMethod) 0) End Select Exit Function ErrorHandler: ‘ 例如正則表達(dá)式模式無效 IsMatch False End Function關(guān)鍵點(diǎn)與避坑指南數(shù)據(jù)類型處理在“exact”模式下我們優(yōu)先判斷是否為字符串是則用StrComp函數(shù)以支持大小寫敏感控制否則直接用等號(hào)比較。這比原生Filter全部轉(zhuǎn)字符串更合理。性能考量正則表達(dá)式對象的創(chuàng)建和銷毀CreateObject和Set regex Nothing有一定開銷。如果在一個(gè)大數(shù)據(jù)集的循環(huán)中頻繁使用“regex”模式會(huì)成為性能瓶頸??梢钥紤]將正則對象創(chuàng)建移到主函數(shù)中作為可選參數(shù)傳入但會(huì)增大接口復(fù)雜度。對于一般應(yīng)用在IsMatch內(nèi)部創(chuàng)建是清晰簡單的做法??罩堤幚鞩sEmpty判斷至關(guān)重要。VBA數(shù)組中經(jīng)常存在Empty值直接對其進(jìn)行字符串轉(zhuǎn)換或比較可能導(dǎo)致類型不匹配錯(cuò)誤。這里選擇將任何一方為Empty的匹配直接判定為False邏輯上更安全。3.2 動(dòng)態(tài)數(shù)組構(gòu)建與結(jié)果收集策略原生Filter函數(shù)內(nèi)部知道結(jié)果數(shù)量可以直接分配一個(gè)大小合適的數(shù)組。我們的自定義函數(shù)在遍歷完成前無法預(yù)知有多少項(xiàng)符合條件。因此需要一種動(dòng)態(tài)收集匹配項(xiàng)索引或引用最后再構(gòu)建結(jié)果數(shù)組的策略。我采用了Collection對象作為中間容器來收集匹配行的索引對于一維數(shù)組或匹配行的索引數(shù)組對于二維數(shù)組按行篩選。Collection在VBA中對于動(dòng)態(tài)增刪非常高效?!?假設(shè)我們已經(jīng)確定是二維數(shù)組按行篩選 (Dimension 1) Dim matchedRows As New Collection Dim i As Long, j As Long Dim rowMatchesAllConditions As Boolean Dim conditionArr As Variant ‘ 假設(shè)這是處理好的條件數(shù)組 Dim matchModeStr As String ‘ 假設(shè)這是匹配模式 For i LBound(SourceArray, 1) To UBound(SourceArray, 1) ‘ 遍歷每一行 rowMatchesAllConditions True ‘ 假設(shè)初始匹配用于AND邏輯 ‘ 對于當(dāng)前行檢查所有條件 For j LBound(conditionArr) To UBound(conditionArr) ‘ 這里需要根據(jù)條件與行的對應(yīng)關(guān)系進(jìn)行比較可能只比較特定列 ‘ 假設(shè)條件數(shù)組的每個(gè)元素是一個(gè)結(jié)構(gòu)體或數(shù)組包含“比較值”和“比較列索引” ‘ 這里簡化為直接比較當(dāng)前行的第一列與條件值 If Not IsMatch(SourceArray(i, 1), conditionArr(j), matchModeStr, Compare) Then If ConditionLogic “AND” Then rowMatchesAllConditions False Exit For ‘ AND邏輯下一個(gè)條件不滿足整行就不滿足 End If Else If ConditionLogic “OR” Then rowMatchesAllConditions True Exit For ‘ OR邏輯下一個(gè)條件滿足整行就滿足 End If End If Next j ‘ 根據(jù)Include參數(shù)和匹配結(jié)果決定是否收集 If (rowMatchesAllConditions And Include) Or (Not rowMatchesAllConditions And Not Include) Then matchedRows.Add i ‘ 收集行號(hào) End If Next i遍歷結(jié)束后matchedRows這個(gè)Collection里就存放了所有符合條件的行號(hào)。接下來根據(jù)這個(gè)行號(hào)集合來構(gòu)建結(jié)果數(shù)組If matchedRows.Count 0 Then ‘ 沒有匹配項(xiàng)返回一個(gè)空的數(shù)組 SuperFilter Array() ‘ 返回一個(gè)包含0個(gè)元素的數(shù)組 Else ‘ 根據(jù)源數(shù)組的維度和篩選維度構(gòu)建結(jié)果數(shù)組 Dim resultArr() As Variant Dim targetRowIndex As Long, srcRowIndex As Long Dim colCount As Long ‘ 計(jì)算列數(shù)對于按行篩選 colCount UBound(SourceArray, 2) - LBound(SourceArray, 2) 1 ‘ 重新定義結(jié)果數(shù)組的大小 ReDim resultArr(1 To matchedRows.Count, 1 To colCount) targetRowIndex 1 For Each srcRowIndex In matchedRows ‘ 遍歷收集到的行號(hào) For j 1 To colCount ‘ 復(fù)制數(shù)據(jù)保持原數(shù)據(jù)類型 resultArr(targetRowIndex, j) SourceArray(srcRowIndex, j) Next j targetRowIndex targetRowIndex 1 Next srcRowIndex SuperFilter resultArr End If實(shí)操心得使用Collection而非ReDim Preserve在循環(huán)內(nèi)部頻繁使用ReDim Preserve來擴(kuò)大數(shù)組是非常低效的因?yàn)槊看蜳reserveVBA都需要在內(nèi)存中創(chuàng)建一個(gè)新的更大數(shù)組并復(fù)制所有舊數(shù)據(jù)。Collection的.Add方法在動(dòng)態(tài)增長方面性能好得多。明確數(shù)組下界VBA數(shù)組默認(rèn)下界可能是0也可能是1取決于如何聲明和賦值。使用LBound和UBound函數(shù)始終是最安全的做法能確保代碼的健壯性。返回空數(shù)組的處理當(dāng)沒有匹配項(xiàng)時(shí)返回Array()一個(gè)長度為0的數(shù)組比返回Null或Empty更友好。調(diào)用方可以用If UBound(SuperFilter(...)) LBound(SuperFilter(...)) Then來判斷是否有結(jié)果這與處理原生Filter的結(jié)果習(xí)慣一致。4. 完整實(shí)現(xiàn)與代碼剖析下面是將上述思路整合后的SuperFilter函數(shù)的一個(gè)相對完整的簡化版本重點(diǎn)展示架構(gòu)和邏輯。實(shí)際版本可能包含更多錯(cuò)誤處理和邊界情況判斷。Option Explicit ‘ 定義匹配模式枚舉使代碼更易讀實(shí)際使用字符串也可 ‘ Private Enum MatchModes: mmExact: mmStartsWith: mmEndsWith: mmContains: mmRegex: End Enum Function SuperFilter(SourceArray As Variant, _ Match As Variant, _ Optional Include As Boolean True, _ Optional Compare As VbCompareMethod vbBinaryCompare, _ Optional MatchMode As String “contains”, _ Optional ConditionLogic As String “AND”, _ Optional Dimension As Long 1) As Variant ‘ —————————— 1. 參數(shù)驗(yàn)證與初始化 —————————— If Not IsArray(SourceArray) Then Err.Raise 13, “SuperFilter”, “SourceArray 必須是一個(gè)數(shù)組?!?End If Dim numDims As Long numDims GetArrayDimensions(SourceArray) ‘ 自定義函數(shù)獲取數(shù)組維數(shù) If numDims 2 Then Err.Raise 5, “SuperFilter”, “暫不支持二維以上的數(shù)組?!?End If ‘ 統(tǒng)一將Match轉(zhuǎn)換為數(shù)組方便后續(xù)處理 Dim conditionArr() As Variant If IsArray(Match) Then conditionArr Match Else ReDim conditionArr(0 To 0) conditionArr(0) Match End If ‘ 驗(yàn)證MatchMode MatchMode LCase(Trim(MatchMode)) If Not (MatchMode “exact” Or MatchMode “startswith” Or _ MatchMode “endswith” Or MatchMode “contains” Or MatchMode “regex”) Then MatchMode “contains” ‘ 默認(rèn)回退到包含模式 End If ‘ —————————— 2. 分派到不同的處理流程 —————————— Dim result As Variant If numDims 1 Then result SuperFilter1D(SourceArray, conditionArr, Include, Compare, MatchMode, ConditionLogic) Else ‘ numDims 2 If Dimension 1 And Dimension 2 Then Dimension 1 result SuperFilter2D(SourceArray, conditionArr, Include, Compare, MatchMode, ConditionLogic, Dimension) End If SuperFilter result End Function ‘ 處理一維數(shù)組的核心私有函數(shù) Private Function SuperFilter1D(SourceArr As Variant, _ ConditionArr As Variant, _ Include As Boolean, _ Compare As VbCompareMethod, _ MatchMode As String, _ ConditionLogic As String) As Variant Dim matchedIndices As New Collection Dim i As Long, c As Long Dim elem As Variant Dim conditionMet As Boolean For i LBound(SourceArr) To UBound(SourceArr) elem SourceArr(i) conditionMet EvaluateConditions(elem, ConditionArr, MatchMode, Compare, ConditionLogic) If (conditionMet And Include) Or (Not conditionMet And Not Include) Then matchedIndices.Add i End If Next i ‘ 構(gòu)建結(jié)果數(shù)組 If matchedIndices.Count 0 Then SuperFilter1D Array() Else Dim result() As Variant ReDim result(LBound(SourceArr) To LBound(SourceArr) matchedIndices.Count - 1) ‘ 注意這里簡化了實(shí)際應(yīng)處理下界可能為0的情況 Dim idx As Long, pos As Long pos LBound(result) For Each idx In matchedIndices result(pos) SourceArr(idx) pos pos 1 Next idx SuperFilter1D result End If End Function ‘ 處理二維數(shù)組的核心私有函數(shù) (按行篩選示例) Private Function SuperFilter2D(SourceArr As Variant, _ ConditionArr As Variant, _ Include As Boolean, _ Compare As VbCompareMethod, _ MatchMode As String, _ ConditionLogic As String, _ ByVal Dimension As Long) As Variant ‘ 實(shí)現(xiàn)邏輯與上文“動(dòng)態(tài)數(shù)組構(gòu)建”示例類似遍歷行/列使用EvaluateConditions判斷整行/列是否滿足條件 ‘ 此處省略詳細(xì)代碼結(jié)構(gòu)同SuperFilter1D但內(nèi)部循環(huán)和結(jié)果數(shù)組構(gòu)建是二維的。 ‘ ... ‘ 返回一個(gè)二維Variant數(shù)組或空數(shù)組 End Function ‘ 評估單個(gè)源值 against 一組條件的私有函數(shù) Private Function EvaluateConditions(SourceValue As Variant, _ ConditionArr As Variant, _ MatchMode As String, _ Compare As VbCompareMethod, _ ConditionLogic As String) As Boolean Dim j As Long Dim condMet As Boolean Dim overallResult As Boolean If ConditionLogic “AND” Then overallResult True ‘ AND邏輯初始為真遇到一個(gè)假則變假 For j LBound(ConditionArr) To UBound(ConditionArr) If Not IsMatch(SourceValue, ConditionArr(j), MatchMode, Compare) Then overallResult False Exit For End If Next j Else ‘ “OR” 邏輯 overallResult False ‘ OR邏輯初始為假遇到一個(gè)真則變真 For j LBound(ConditionArr) To UBound(ConditionArr) If IsMatch(SourceValue, ConditionArr(j), MatchMode, Compare) Then overallResult True Exit For End If Next j End If EvaluateConditions overallResult End Function ‘ 獲取數(shù)組維數(shù)的幫助函數(shù) Private Function GetArrayDimensions(arr As Variant) As Long On Error Resume Next Dim dims As Long dims 0 Do dims dims 1 Err.Clear Dim lb As Long lb LBound(arr, dims) If Err.Number 0 Then Exit Do Loop GetArrayDimensions dims - 1 End Function代碼設(shè)計(jì)要點(diǎn)模塊化將一維和二維數(shù)組的處理拆分成獨(dú)立的私有函數(shù)SuperFilter1D和SuperFilter2D主函數(shù)只負(fù)責(zé)路由和基礎(chǔ)驗(yàn)證。這使得代碼結(jié)構(gòu)清晰易于維護(hù)和調(diào)試。條件評估分離EvaluateConditions函數(shù)專門負(fù)責(zé)根據(jù)ConditionLogicAND/OR來綜合多個(gè)條件的判斷結(jié)果。IsMatch函數(shù)前面已定義則負(fù)責(zé)最底層的單個(gè)值比較。這種分層設(shè)計(jì)符合單一職責(zé)原則。健壯性開頭進(jìn)行了必要的參數(shù)驗(yàn)證并使用Err.Raise拋出清晰的錯(cuò)誤方便調(diào)用者調(diào)試。GetArrayDimensions函數(shù)優(yōu)雅地處理了獲取未知數(shù)組維數(shù)的問題。5. 實(shí)戰(zhàn)應(yīng)用與性能優(yōu)化探討5.1 典型使用場景示例假設(shè)我們有一個(gè)從Excel表格讀取的二維數(shù)組data結(jié)構(gòu)如下姓名部門銷售額日期張三銷售部15002023/10/1李四技術(shù)部8002023/10/2王五銷售部22002023/10/1趙六市場部12002023/10/3‘ 場景1精確篩選部門為“銷售部”的所有行原生Filter做不到 Dim result1 As Variant result1 SuperFilter(data, “銷售部”, True, vbTextCompare, “exact”, , 1) ‘ 結(jié)果將是一個(gè)包含張三和王五兩行的二維數(shù)組。 ‘ 場景2多條件AND篩選銷售部且銷售額大于1000 ‘ 假設(shè)我們構(gòu)建一個(gè)條件數(shù)組每個(gè)條件是一個(gè)包含“比較值”和“比較列索引”的數(shù)組。 ‘ 這里簡化演示假設(shè)我們分別對第2列部門和第3列銷售額進(jìn)行篩選。 ‘ 注意對于數(shù)值比較MatchMode用”exact”并不合適實(shí)際需要擴(kuò)展MatchMode支持”greaterthan”等。 ‘ 一種變通方法是使用正則表達(dá)式或直接在EvaluateConditions中寫特殊邏輯。 ‘ 更優(yōu)雅的設(shè)計(jì)是允許Match為對象數(shù)組或自定義類型數(shù)組包含比較運(yùn)算符。 ‘ 本例展示思路 Dim conditions(1) As Variant conditions(0) Array(“銷售部”, 2) ‘ 第2列等于“銷售部” conditions(1) Array(“^([1-9]\d{3,}|[2-9]\d\d\d)$”, 3) ‘ 第3列匹配正則大于等于1000的數(shù)字字符串形式 ‘ 這里需要自定義IsMatch函數(shù)能識(shí)別這種結(jié)構(gòu)化的條件并解析。 ‘ 這展示了SuperFilter框架的擴(kuò)展性。 ‘ 場景3篩選日期為2023/10/1的記錄原生Filter會(huì)將其轉(zhuǎn)為字符串再匹配不可靠 Dim result3 As Variant result3 SuperFilter(data, #10/1/2023#, True, vbBinaryCompare, “exact”, , 1) ‘ 直接使用日期類型進(jìn)行精確匹配可靠。 ‘ 場景4反向篩選Include:False排除所有部門名稱中包含“部”字的行模擬原生Filter Dim result4 As Variant result4 SuperFilter(data, “部”, False, vbTextCompare, “contains”, , 1) ‘ 返回部門名不包含“部”的行可能為空。5.2 性能瓶頸分析與優(yōu)化建議自定義函數(shù)在帶來靈活性的同時(shí)必然會(huì)在性能上有所犧牲尤其是與高度優(yōu)化的原生函數(shù)相比。SuperFilter的主要性能開銷在雙層循環(huán)對于二維數(shù)組的多條件篩選是O(m*n)的復(fù)雜度m行*n條件。當(dāng)數(shù)據(jù)量巨大數(shù)萬行時(shí)循環(huán)本身會(huì)成為瓶頸。頻繁的類型判斷與函數(shù)調(diào)用在循環(huán)內(nèi)部每次比較都要調(diào)用IsMatch內(nèi)部還有Select Case、StrComp、InStr甚至CreateObject正則等操作。Variant類型操作Variant是VBA中開銷最大的數(shù)據(jù)類型頻繁的讀取、賦值和比較會(huì)比明確類型的變量慢。優(yōu)化策略提前進(jìn)行類型判斷和轉(zhuǎn)換如果事先知道某列全是數(shù)字或日期可以在主循環(huán)外進(jìn)行類型判斷并在IsMatch函數(shù)中為這種類型實(shí)現(xiàn)快速路徑避免每次都進(jìn)行VarType判斷和CStr轉(zhuǎn)換。使用靜態(tài)正則對象如果匹配模式是“regex”且模式不變可以在模塊級(jí)別聲明一個(gè)靜態(tài)的RegExp對象在函數(shù)中重復(fù)使用避免反復(fù)創(chuàng)建銷毀。針對純字符串一維數(shù)組的快速路徑如果檢測到輸入是一維字符串?dāng)?shù)組且匹配模式是“contains”可以退化到使用原生Filter函數(shù)進(jìn)行第一步快速篩選然后再對結(jié)果應(yīng)用其他條件或處理。這相當(dāng)于用原生函數(shù)做了一次預(yù)過濾。限制條件數(shù)量在業(yè)務(wù)邏輯允許的情況下盡量減少單次篩選的條件數(shù)量。將最嚴(yán)格、最能過濾掉數(shù)據(jù)的條件放在前面判斷可以提前退出循環(huán)對于AND邏輯。數(shù)組切片與內(nèi)存操作對于超大規(guī)模數(shù)據(jù)可以考慮借助Windows API調(diào)用或編寫C DLL來實(shí)現(xiàn)內(nèi)存塊的高效比較但這大大增加了復(fù)雜度僅適用于極端性能場景。注意對于絕大多數(shù)Office VBA應(yīng)用場景數(shù)據(jù)處理量在幾千到幾萬行上述SuperFilter函數(shù)的性能是完全可接受的。優(yōu)化時(shí)應(yīng)遵循“先測量后優(yōu)化”的原則用Timer函數(shù)定位真正的熱點(diǎn)避免過度設(shè)計(jì)。6. 常見問題與排查技巧實(shí)錄在實(shí)際使用和調(diào)試SuperFilter函數(shù)的過程中我遇到了不少典型問題。這里記錄一下方便大家避坑。問題1函數(shù)返回#VALUE!錯(cuò)誤或運(yùn)行時(shí)錯(cuò)誤‘13’類型不匹配。排查思路檢查源數(shù)組確保傳入的SourceArray確實(shí)是一個(gè)數(shù)組。有時(shí)從某個(gè)可能返回單值的函數(shù)獲取數(shù)據(jù)需要先判斷IsArray()。檢查條件值類型當(dāng)使用“exact”模式比較數(shù)字和字符串時(shí)“123”和123是不相等的。確保你的Match參數(shù)類型與數(shù)組中對應(yīng)元素的類型一致或理解這種差異。二維數(shù)組的維度參數(shù)確保對二維數(shù)組調(diào)用時(shí)Dimension參數(shù)只傳了1或2。傳了0或3會(huì)導(dǎo)致后續(xù)計(jì)算索引時(shí)出錯(cuò)。正則表達(dá)式模式無效當(dāng)MatchMode為“regex”時(shí)如果傳入的匹配字符串不是有效的正則表達(dá)式regex.Test會(huì)出錯(cuò)。確保在IsMatch函數(shù)中做好了錯(cuò)誤捕獲。問題2篩選結(jié)果為空但明明覺得應(yīng)該有數(shù)據(jù)。排查思路字符串比較模式Compare參數(shù)這是最常見的原因。vbBinaryCompare區(qū)分大小寫”Apple”和”apple”不匹配。vbTextCompare不區(qū)分。檢查你的數(shù)據(jù)大小寫和參數(shù)設(shè)置。匹配模式MatchMode理解錯(cuò)誤想要精確匹配卻用了默認(rèn)的“contains”。仔細(xì)核對MatchMode參數(shù)。前后空格數(shù)據(jù)中可能存在肉眼不易察覺的首尾空格。使用Trim函數(shù)清洗源數(shù)據(jù)或條件值。可以在IsMatch函數(shù)內(nèi)部對字符串比較加入自動(dòng)Trim的選項(xiàng)但需注意對于精確匹配有時(shí)空格是有意義的。多條件邏輯ConditionLogic錯(cuò)誤誤將“OR”邏輯當(dāng)作“AND”使用或者反之。理清業(yè)務(wù)邏輯。Include參數(shù)理解反了Include:False是返回不匹配的項(xiàng)。確認(rèn)你是否想要的是排除。問題3處理大量數(shù)據(jù)時(shí)速度非常慢。排查思路啟用屏幕更新和計(jì)算關(guān)閉如果是在Excel中循環(huán)調(diào)用該函數(shù)處理大量單元格確保在代碼開頭設(shè)置了Application.ScreenUpdating False和Application.Calculation xlCalculationManual處理完再恢復(fù)。檢查是否在循環(huán)中重復(fù)調(diào)用函數(shù)避免在For Each循環(huán)中針對每一行數(shù)據(jù)都調(diào)用一次SuperFilter。應(yīng)該一次性將整個(gè)數(shù)據(jù)區(qū)域裝入數(shù)組用SuperFilter處理這個(gè)數(shù)組最后將結(jié)果一次性寫回工作表。這是VBA操作數(shù)據(jù)的黃金準(zhǔn)則盡量減少VBA與工作表之間的交互。審視匹配模式是否不必要地使用了開銷巨大的“regex”模式如果只是簡單匹配換成“exact”或“contains”會(huì)快很多。數(shù)據(jù)量是否真的超出了VBA處理范圍如果數(shù)組有幾十萬行VBA循環(huán)本身就會(huì)很慢??紤]是否能在數(shù)據(jù)庫層面如Access、SQL Server進(jìn)行篩選或者使用Power Query進(jìn)行處理。問題4如何篩選“大于某個(gè)數(shù)值”或“介于某兩個(gè)日期之間”這類范圍條件解決方案當(dāng)前的SuperFilter框架主要通過MatchMode支持文本匹配模式。為了支持?jǐn)?shù)值/日期比較最整潔的擴(kuò)展方式是修改Match參數(shù)和IsMatch函數(shù)的設(shè)計(jì)。方案A快速但不優(yōu)雅將MatchMode擴(kuò)展增加“gt”大于、“l(fā)t”小于、“gte”大于等于、“l(fā)te”小于等于、“between”介于等模式。此時(shí)Match參數(shù)可能需要是一個(gè)兩元素?cái)?shù)組來表示范圍。這需要修改IsMatch函數(shù)來支持這些新的比較運(yùn)算符。方案B更靈活允許Match參數(shù)傳入一個(gè)自定義的回調(diào)函數(shù)函數(shù)指針。在IsMatch中如果發(fā)現(xiàn)Match是一個(gè)函數(shù)則調(diào)用這個(gè)函數(shù)來進(jìn)行判斷。這樣用戶可以將任何復(fù)雜的比較邏輯寫成一個(gè)獨(dú)立的函數(shù)傳入。這是最強(qiáng)大但也對使用者要求最高的方式。方案C實(shí)用折中對于簡單的范圍篩選可以結(jié)合使用Include:False。例如要篩選銷售額大于1000的可以先篩選出小于等于1000的然后取反。但這對于“介于兩者之間”這樣的條件就有點(diǎn)繞。最終我選擇了在內(nèi)部預(yù)留了擴(kuò)展接口但當(dāng)前版本主要優(yōu)化了字符串和精確匹配的通用場景。對于復(fù)雜的數(shù)值比較我通常建議使用方案C的變通方法或者直接在調(diào)用SuperFilter之前用簡單的數(shù)組循環(huán)預(yù)處理出一個(gè)標(biāo)志列然后再用SuperFilter進(jìn)行篩選。工具不是萬能的在復(fù)雜場景下組合使用多種方法往往是最佳實(shí)踐。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产精品乱人伊人网| 变态另类专区| 亚洲欧美国产其他二区| 免费试看60秒| 欧美一二级| 中文字幕在线观看视频www| 人人操,人人液| 亚洲视频二区| 黄色高清久久无码依人| 亚洲天堂热| 久久成人国产精品| 亚洲国产精品无石码久久 | 久久这里精品国产99丫e6| 亚洲一欧洲中文字幕在线| 久久九色| 欧美熟妇精品黑人巨大91| 大香蕉在线视频重口味毛片在线| 99色在线| 东北黄色电影| 亚洲色啪| 爱欲AV| www色日本| 交换娇妻呻吟声不停中文字幕| 天美传媒麻豆一区二区三区国产精| 岛国AV一区二区电影| 国模精品一区二区三区苹果色戒 | 亚洲九月丁香| 强奸乱伦av电影| 国产中文大片资源中文字幕| 日韩无码一级黄色av片| 麻豆国产97在线| 超碰在线一区二区三区| 99久久99九九99九九九| 2020天天色综合| 蜜臀AV成人精品蜜臀| 草草影院在线视频| 欧美日韩国产中文精品字幕自在自线,| 亚洲四虎熟女精品| 色五月激情综合网| 99热66| 亚洲九区| 成人夜夜爽| 亚洲骚女一区二区三区| 区一在线观看| 色眯眯射| 男人的天堂1024| 久久久久久人体| 97中文综合| 热热色综合网| 日本操逼无码| 国产成年免费大片黄在线观看| 色色毛片| 亚洲第一狼人丝袜美女另类 | 久草色悠悠在线视频| 激情五月天婷婷| 婷婷久久五月| 啊啊啊不要好疼视频| 男人的天堂2019AV| 国产精品制服丝袜中文字幕日韩一区二区三区 | 亚洲深夜福利| 国产精品诱惑| 国产9 9在线 | 亚洲| 91精品久久久久五月天精品| 国产成人综合在线播放| 久久男女激情视频网站| 婷婷久久综合| 日韩情色AV| 欧洲亚洲人人爽爽视频| 91美| 7777奇米影视久久| 综合激情五月天| 久久超碰爱| 欧美综合色站| 人妻夜爽夜夜爽| 变态综合色| 国产在线观看一区二区三区| 日韩性爱毛片操骚逼| 激情综合二| 五月天综合| 人妻夜夜爽天天爽麻豆三区网站 | 尤物视频偷拍免费| 91丝袜在线观看| 亚洲色图欧美一区二区不卡| 黄色大片免费在线| 六九九九| 91 国产丝袜在线播放-百度| 精品少妇人妻av久久免费| 亚洲第一在线视频| 亚洲色图国产另类| 色色毛片| av在线人气| 亚洲色棕合| 乱伦熟女论坛| 91在线色综合| 死我十八禁| 欧美综合另类| 国产高潮AA片免费看| 91亚洲人电影| 99久久无码| 婷婷五月av| 美女干逼2| 97超碰9| 伊人精品久久网站| 欧美精品偷拍| 一二三区操逼国产91| 黄片免费看黄片免费看| 欧美一二在线| 欧美十八禁视频| 日韩有码免费视频| 五月天九九日国产精品一区二区三区| 久久精品国产亚洲AV成人直播| 亚洲成人一二三区| 亲子敌伦对白在线播放| 日韩AV电影网站| 天天综合网~91| 久草免费在线一区二区| 少妇天堂| 日韩久久三区| 九九九久久久W精品| 自拍偷拍 高清无码| 四虎免费看黄| 亚洲1区2区三区高清中文字幕| 97这里都是精品| 起碰97| 91久久国产综合久久| 九九超碰综合网| 亚洲av影音先锋| 国产五码丝袜屁眼| 亚洲精品啪视频| 足交视频老司机| 一级@啪啪视频| 日韩美脚一区二区网站| 亚洲丝袜综合| 色综合潮| 欧美人与性动交a美精品| 日欧毛片久久| 在线观看中文av字幕| 四虎在线免费视频| 日本高清一区二区在线| 亚洲精品蜜桃久久久| 亚洲导航深夜福利| 久久久免费高清中文视频| 伦理片秋霞免费影院| 粉嫩av一区二区三区四季| 成人网站 免费观看| 强奸乱伦麻豆| 天天综合网亚洲综合网| 欧美精品1区2区3区| 91色婷婷综合久久中文字幕二区| 偷拍盗拍亚洲色图图片| 日韩精品一区二区高清| 中文字幕jul-617人妻熟女| 五月天激情小说网| 青青草色插素人| 人伦四五区| 国产少妇内射| 日日干夜夜操视频h| 久久老女人| 亚洲不卡不卡中文字幕不卡| 精品国产乱码久久久兰草影视| 91大神精品长腿在线观看网站| 黑人美精品 A片| 92福利社视频| 亚洲drav色图| 午夜福利1区2区3区| 家庭乱伦性爱av| 久久久爆乳翘臀一线天伦理视频| 北条麻妃性愛视频| 日本媚薬中文字幕在线| 欧美视频一区二区在线| 偷拍 精品 另类 四区| 我中文字幕6区| 九九九九九九九九九国产精品 | 91人妻爽爽人人做人人澡| 狠狠图片青青草| 992视频一区| 成年人三级黄色片视频| 久久国产99精品72福利 | 五月天大香蕉| 四虎免费视频| 激情网色| 中文字幕综合人妻| 亚洲精品久久久久毛片A片拉屎 | 95自拍视频在线观看| 激情五月天网站| 大乔未久88一区| 亚洲精品97| 伊人婷婷五月天| 亚洲宗合网| 国产成年精品高清在线观看91| 免费观看欧美日韩操逼视频| 久久精品国产97欧美精品亚洲 | 日韩兔费看黄片| 无遮挡h肉动漫在线观看| 日本中文字幕高跟| 大色综合| 91久久久久免| 亚洲图片欧美| 91欧美高清| 精品人妻一区二区三区四区| 狠狠色综合网| 久肏视频字幕| 久久精品国产72国产精品福利| 久久精品视频在线观看| 福利视频一区二区微拍| 国桃视频产巨乳精品一区二区在线| 富女玩鸭子一级毛片| 久久极品一区二区| 久久东京热久久| 9久精品| 黑人精品欧美一区二区蜜桃| 亚洲免费人妻在| 欧美最大综合网| 欧美东京热精品A∨| 欧美少妇高潮久久91| 亚洲天堂一区二区久久| 天美精品一区二区三区四区在线观看| 久久性爱精品一区| 亚洲性猛交| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 无码操逼视频一下| 日本一天色道久久久精品视频| 四虎国产精品永久在线囯在线 | 免费综合亚洲中文| 日日骚一区二区三区| 天堂种子在线www网资源| 精品十八在线观看| 97超级久久强资源| 色在线综合| 久久久久元码视频| 婷婷激情综合网| 色香综合| 欲色影视综合吧| 亚洲 自拍偷拍 欧美| 丝袜色综合| 四虎影院成年人片| 中国一级αV| 诱惑人妻欧美一区在线播放| 国产亚洲精品农村妇女| 色爱天堂| 99蜜桃臀亚洲成人在线观看| 日本日皮视频逼| 精品人妻一区二区免费蜜桃视频| 色综合加勒比四四季| av最新免费中文字幕| www. 男人天堂成人在线| 亚洲国产日韩欧美熟妇在线| 3PAV乱伦视频| 91 天天综合| 九九英色视频| 国产超碰| 午夜电影在线观看无码专区| 亚洲色图欧美一区二区不卡| 午夜精品久久久99热蜜桃的功能特点| 91是天天| 99热免费| 国产三级中文有码在线视频| 91搞逼视频| 最新制服中文第一页| 97超碰热线| 日产狠狠干| 强奸乱伦亚洲第一页| 欧美性第1页| 久久精品视频在线观看| 97国产中文| 女一区二区| 蜜臀少妇一区二区| 精品人妻美妇91job| 天天综合91| 老鸭窝成人| 日韩精品大香蕉伊人在线| 黄页大片在线观看| www.久久久久| 97精品综合久久| 一类av片在线看| 操逼操逼操| 久久精品久久久久久久| 日韩在线电影| juliaann欧美丝袜办公室| 日韩欧美天天爽爽爽天天爽爽| 中文字幕日韩综合| 一区二区激情国产熟女| 欧美日韩99| 国产区91柔拿会所技师| 国产又黄又粗又猛大片| 97资源久久| 日韩精品一区,二区 九九...老司机| 樱花蜜乳av| 能在线播放的国产三级| 久久婷婷在线观看视频| 欧美激情性爱视频网站| 性交一区二区在线播放| 二男一女成人A片| 精品人妻免费观看| 国产传媒日韩欧美| 久久9久| 国产欧美日产一区二区三区 - 国产欧美日 | 欧美韩国你懂得在线 | 91 刺激在线| 国产精品免费视频不卡| 黄片在线免费在线观看| 无码视频黄色网战| 一区二区三区精品视频| 久久ww| 天美麻花大全视频| 大香蕉综合| 亚洲色图亚洲无码强奸乱伦| 丰满人妻一区二区三区大胸懂色 | 久热热| 国产精品9999| 久96热在线观看视频| 思思久热在线精品66| 天天干人人看综合| 国内毛片欧美香蕉精品| 亚洲精品一区二区精品| 欧美激情性爱视频网站| 黑人操一区二区| 免费簧片在线观看| 粉嫩绯色AV一区二区在线| 欧亚性爱视频免费看| 日本高清有码网址视频| 日韩人妻无码专区| 色蜜AV| 人妻一区二区三区| 91五月天| 欧美美逼| 国产精品第一区第一页| 亚洲激情综合另类男同| 日本三级中国三级99人妇网站| 五月天激情综合网| 精品久久久久黄少妇| 亚欧中文字幕在线视频| 一区二区无码视频| 黄片www视频免费| www.yeyecao| 3p国产欧美99热| 日本精品一区三区| 超碰久久草| 丝袜美腿91| 久久精品人妻一区| 99在线无码精品秘 入口黑人| 精品超碰国产| 久久欧洲| 天美传媒婬乱在| 国产黄色小视频网站| 国产AV无码AV| 亚洲天天艹| 骚女高跟AV在线| 大香蕉线| 日韩精品免费高清视频在线| 九九色综合| 蜜臀色乳| 欧美人黑A片无码免视费| 青娱乐国产盛宴视频| 91狠狠综合久久久久久| 欧美狠狠鲁| 亚洲 欧美 色图| 国产欧美精选激情视频| 国产11页| 欧美日韩系列| 日韩精品一区二区日韩| 久久久精品日本一道| 亚洲在钱| 中文字幕精品一区二| 成功精品影院| 精品女同一区| 国产精品视频自拍在线| 91AV老熟女视频| 亚洲欧美综合网站| 欧美爆乳精品一区二区| 另类视频在线| 久久九九97| 亚州免费啪啪视频| 国产乱人妻精品入口| 欧美色图亚洲色| 国产又操| 久久精品电影| 高潮毛片无遮挡高清免费| 九九无码| 欧美激情高清性猛交| 亚洲天堂无码| 欧美综合777| 国产又黄又粗的视频| 丰满人妻一区二区三区四| 密臀国产在线| 曰韩成人免费视频| 国产情色第一第二页在线观看| 放黄片放3级黄片没穿衣服| 啪啪啪综合网| 丰满人妻-区二区三区免费看| 亚洲最大AV网| 欧美最大综合网| 中国女人内射6XXXXX| 久操在97| 亚洲av综合色| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 国产一级137片内射麻豆| 男人的天堂2018.| 久久久久久久性爱| 激激五月| 日韩啊V| 91jk色拍| 园内精品自拍视频在线播放| 日本东京热大香蕉a片| 人妻偷拍一区二区三区| 久久国语| 操逼逼无码| 精品国产乱码久久久影院| 欧美精品久久久久久久久88| 全国男人天堂网| 99在线精品观看99| 日本韩高清无砖码22o| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 3028国产精品| 97在线视频观看免费| 色综合网1| 熟女精品日韩一区二区三区| 亚洲天堂电影精品一区| 九九九热| 成人在线午夜视频一区| 91精品无码人妻系列| 91模特在线观看| 高清无码网址| 26uuu欧美日韩| 欧美男人亚洲天堂| 五月丁香综合激情| 91香蕉视频在线观看免费| 男人网站婷婷| 国产玖玖| 婷婷激情五月天小说网| 好爽视频在线观看视频| 99九九久久| 国产麻豆一级精品视频| 26uuu最新| www. 男人天堂成人在线| 久久性视频| 2020久久免费视频| 丰满人妻一区| 久久精品亚洲婷婷| 午夜无码精品免费看性色| 深夜激情| 色制服丝袜夫妻av一区| 丁香五月天堂网| 亚洲精品一二牛牛| 欧美日韩制服| 操少妞在线视频| 翘臀vidoes| 亚洲欧美综合区自拍另类| 欧美92| 欧美91精彩| 99色在线视频| 啪啪资源网| 男人天堂网站| 99操逼| 蜜臀久久在线视频| 懂色综合久久久| 一区二区三区激情在线观看| 国产美女自拍AV| 蜜桃臀av一区二区| 欧美黑人168页欧美黑人167| 18精品一区| 99视频在线| 日韩国产不卡在线视频| 91在线视频国产网站| 九九九九九九免费视频| 色av中文字幕| 91n美女视频| 色婷网| 欧美操逼熟女| 在线观看免费视频国产| 国产高清成人免费视频| 超碰美国| 色五月av| 久久九色| 日本一区不卡| 一区二区影视| 大鸡巴久久| 日韩电影中文字幕| 少妇特黄一区二区三区| 亚洲网污污污污| 免费人人搞97| 国产福利夜| http://qxhbdz.com| 久久,精品一二三| 婷婷综合久久| 深爱五月婷婷| 色色色综合| 婷婷伊人| 久久人妻办公室视频| 一级免费啪啪片| 竹菊影视国产一区二区| 亚洲九月丁香| 中国探花熟女| 六十路日本| 日本三级日本三级99| 操逼逼无码| 国产尹人在线视频免费| 婷婷99狠狠| 92福利社视频| 又黄又爽在线观看视频| 中文字幕 一区二区 亚洲无码| 96精品在线| 好淫网一二三视区| 双插在线| 99在线啪| 欧美综合综合| 久9九综合在线| www.av家庭乱伦| 高清国产无码av| 国产在线激情视频| 尤物一级在线免费观看| 99婷婷| 婷婷国产精品九区| 亚州色图欧美| 色色青青久久| 夜夜躁狠狠躁日日躁av| 中国操逼无码| www国产天美久久久| 欧美 亚洲 偷拍自拍| 色区久久| 在线 亚洲 网爆 自拍| 中文字幕久久精视频久久大全| 久热大香蕉网站| 大粗鳼巴久久久久| 日韩操啪| 色官网在线| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 精品国产乱码久久久久久网站入口| 亚洲欧洲激情卡通另类文学四射小说网站 | 91欧美长吊| 蜜桃臀一区二区aV| 99久久99久久免费精品蜜臀| 亚洲第一黄色av网站| 超碰在线国产| 精品人妻视频一区二区三区蜜桃视频| 另类专区加勒比| 神马久久久久| 日本午夜精品理论片A级APP发布| 久久手机好看网站| 久久9精品网站| 四虎在线观看视频| AV免费在线播放一区| 日韩有码一区三区| 亚州男人的天堂| 九九九九热| 97视频在线观看高清资源| 人人操人人精品影片| 国产在线观看一区二区三区| 日韩,欧美,中文在线| 欧美一区二区在线资源| 一卡二卡在线播放| 中文字幕一区二区在线日韩精品| 99亚洲精品| 蜜臀久久99'精品久久久| 日韩亚洲欧美中文字幕| 女人高潮抽搐喷水视频网站| 欧美亚洲美少妇一区二区| 人人妻人人澡人人爽久久av| 综合欧美激情网| 91色黑人少妇| 99精品人妻| 91人妻Pr| 大香蕉伊然在亚洲91| 日日操免费视频| 日本熟妇一区二区三区| 午夜操一视频一区| 久久国内| 蜜屁Av| 无码人妻精品一区二区三区99不卡 | 欧美加勒比| 日本网色| 青青草中日韩在线| 凹凸视频在线观看伊人| 久草资源欧美在线视频| 女人天堂av在线播放| 91碰碰| 精品免费成人久久| 99久久精品欧美国产| 国产a级精品| 中文字幕97色| 老女人老91妇女老热女| 在线有码中文字幕| 亚洲天堂第一页| 91精品婷婷国产综合久久竹菊| 东京热毛片177b2viP| 日韩999| 日韩精品系列| 国产激情片在线观看| 99热8| 免费簧片在线观看| 成年人免费观看网站| 欧美顶级黄色大片免费| 九九九精品一区二区无码| 欧美激情另类一区二区| 亚洲情色在线| 国产精品探花视频| 国产精品一二三| AV综合中文字幕干| 伦理第一页| 熟女丝袜视频| 欧美日韩午夜精品一区二区三区| 老师充足的奶水小说| 操婢日韩| 夜夜青青无码影院| 无码伊人久久大杳蕉中文无码| 208天天久久九九九| 99久久99九九99九九九| 91 欧美| 四虎国产成人精品免费一女五男| 九月激情婷婷| 9九九国产| 国内外色色色色色成人视频| 国产精品久久久啊| 欧美亚洲美少妇一区二区| www.av在线视频| 天堂网亚洲区手机版| 精品精品精品| 在线无码网站| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 国产精点久久久成人| 午夜福利 成人 91| 欧美制服网站美腿丝袜| 1人人看人人摸人人操| 91影视亚洲| 国产av尤物| 日韩美女啪啪一区| 日本一卡二区在线| 亚洲不卡av在线| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 日本五十路熟女一区二区| 999热日韩精品| 啊好大好舒服| 手机看av网站在线看| 国产精品久久蜜乳av| 日日A∨| 狠狠色婷婷777| 手机午夜电影神马久久| 日韩BBN| 精品小视频在线| 婷婷五月天伊人| 欧美国产欧美在线观看| 大香久久| 久久视频,这里只有精品| 亚洲影视综合网| 国产亚洲精品玖玖玖在线观看| 日韩无码一区二区三区| 骚人妻少妇视频| 久久婷婷色综合一区二区三区| 午夜爽爽爽在线观看永久入口姬片| 午夜在线播放| 九九人妻| 麻豆一区在线| 久久久久9久久久久| 激情久久av一区av二区av| a亚洲欧美色欲| 98超碰欧美| 美女黄码视频午夜| 日本999精品视频| 久久精品欧美一区蜜桃| 免费看欧美美女黄色大片| 中国操逼无码| 丁香色狠狠色综合久久小说| 国内外激情在线| a片亚洲一本通视频| 亚洲国产综合久久天堂| 操碰97| 国产在线视视频有精品| 精品国产一区二区三区四区在线看 | 欧美天天拍| 久操热线| 91精品国产麻豆国产自产在| 亚洲成人av电影在线| 欧美人与动性人交a| 精品视频久久| AV天堂因数| 校园春色美腿丝袜| 97 国产精品| 伊人久久亚洲色欲综合网站| 亚洲91网站| 性色av一区二区| 欧美午夜色妇色鬼| 78久久久| 97爱爱影院| 日本A级视频| 亚洲熟妇熟在线电影视频| 久久久久久中文字幕中文字幕最新| 色色99| 久久超碰爱| 天天舔天天 | 亚洲国产精品有声| 干日本人少妇午夜寂寞影院| 99国产精品视频尤物| 中文精品一区二去| 亚洲免费成人精品电影| 亚洲情色中文字幕一区| 91成人久久| 国模少妇一区二区三区| 色色色热| 麻豆蜜桃视频在线观看| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 人人操人人色网| 香蕉欧美| 国产亚洲精品美女久久久| av在线观看不卡网站| 久久直播国产| 精品国产久热在线观看| 99热婷婷| 色呦呦、国产精品| 亚洲色资源| 熟妇一区,二区,三区。| 91精品导航| 欧美成人免费在线观看| www.yeyecao| 国产强奸超碰AV| 99热| 午夜精品久久久久| 国产少妇内射| 欧美大片91| 99e久久国产精品| 大香网站| 中文字幕精品一区二区精品| 97在线欧洲| 国产91专区| 欧美人妻少妇| 操逼片国产| 久久丁香五月婷婷| 欧美狠狠弄| 亚洲亚洲亚洲天堂天堂| 精品国产乱码久久| av无码av无码专区| 亚洲精品男人的天堂| 亚洲综合99999| 91痴汉| 乱性AV| 亚洲午夜福利在线影院| 少妇二级| 智利AV在线网| 国产精品视频内谢女人| 国产1769在线| 色婷婷综合久久久久中文一区二区| 国产久久日| 亚洲风情在线观看| 亚洲s色图| 亚洲色诱惑| 久久精品六区| 欧美日韩*字幕一区| 日本一区二区三区精品| 91色香| 日本中文字幕在线电影| 中文字幕性感少妇av| 99国产精品人妻人伦| www.婷婷六月天| 无码外流操逼视频| 人妻激情视频| 成人性爱高清视频免费看| 亚洲精品蜜桃久久久| 淫穴高潮色图| 熟女熟妇一区二区三区视频| 亚洲熟伦熟妇AV无码春色| 国产综合网站在线播放 | 国内91熟女人妻丝袜天天精品视频在线| 亚洲人妖网| 国产一区二区三区高清视频| 日韩另类| 久久伦理视频久久大香蕉视频| 欧美天天综合| 2018色综合天天操| 9 9精品一区二区三区| 美女网站黄页| 曰韩操B| 精品久一区免费| 啊啊啊啊免费视频| 国产又粗又长又爽又色| 欧美天堂亚洲电影院一区在线播放 | 盗摄 精品 另类 一区| 一本色道久久综合亚洲二区三区| 手机在线中文字幕国产| 泰国AV在线观看| 青青草中文字幕| 丁香六月啪啪| 人妻爽爽啪视频| 一级岛国大片| 欧美久久久15P| 国产又粗又大硬免费色网视频| 色99视频| 久久9久久| 91碰碰碰| 久久在肏| 99久久婷婷国产综合精品草原| 91美女视频电影| 粉嫩av在线一区二区| 色蜜AV| 久热最新在线杭州| 日日狠狠久久偷偷色综合免费| 97操B| 天天干天天拍| 欧美天天综合网| 台湾佬激情综合| 黑人娇小av在线播放 | 国产精品爱欲| 日韩78m视频| 欧美黄色大片在线观看 | 日韩人妻一区二区精品| 91超碰丝袜制服| 9久久精品| 亚洲色婷婷综合久久久久中文| 色色婷婷五月天| 青青草好吊色| 色妹子A V| 天天激情综合站| 久草老司机| 热九九精品| 国产馆| 亚欧美天堂在线| 中文字幕一区二区免费在线| 青青草色插素人| 青青操轻轻| 青青在线视频日韩欧美| 夜夜爽妓女| 综合久久久久久久综合网| 亚拍在线| 亚洲男人的天堂亚洲| 国产精品不卡一区二区三区av| 久久久久久久久久久久黄色 | 风间由美日韩欧美久久| 91色艳| 亚洲一区二区在线观看91| 久久蜜色情在线视频xxx免费观看| 国产精品久久久久久无码红治院| 中出20p| 国产原创自拍| 噜噜噜在线视频| 中国和日本人色哪个不下载能放| 日韩精品高清资源在线| 久久受www免费人成| 色哟哟av| 台湾佬中文娱乐自偷自拍| 精品一区二区成人| 国产精品久久久亚洲第一牛牛_在线观看 | 9九九国产| 东京太热久久久| 啪啪资源网| 精品视频在线观看| 中文字幕超碰CAO| 99热18| 国产亚洲日韩在线三区黑人| 97这里有精品| 青青草在线视频欧美| 国产超碰人人操| 狠狠操官网| 91久| 偷拍五区| 久久av色| 日韩人妻精品久久久久| 欧美日韩国产高清在线一二三区 | 国产夜夜艹| 黑人黄片在线免费观看| 午夜无遮挡男女啪啪视频| 一区二区三区麻豆| 巨爆乳肉感一区二区三区竹菊影视| 91av熟女人妻| 日本大香蕉综合网| 久热99999| 久99热| 欧美顶级黄色大片免费| 国产一级舔足在线观看| 综合色欧美| 日本蜜桃| 久9久| 日本有码影片下载| www.夜夜操| 亚洲超碰AV| 日韩偷拍一区二区三区| 精品视频一二三中文| 天美av在线| 伊人在线大香蕉视频久久| 97色欧州| 日本人妻一区二区| 67914亚洲精品| 99视频内射三四| 日韩欧美中文日韩欧美色| 影视综合无码少妇| 亚洲国产成人精品999| 91中文字幕| 国色综合天| 操久久久久| 男人的天堂kva| 中文字幕免费在线观看| 麻豆传媒一区二区在线观看| 久久国产对白激情浪潮| 综合网欧| 久久久久七视频| 久久中出在线| 欧美在线天堂| 成人av性爱电影在线观看| 亚洲欧美黄| 亚洲色阁| 97日亚洲欧美| 欧美精品97| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 欧亚日韩中文在线| 日韩97在线| 人妻少妇精品| 91久久久亚洲| 香伊人在线| 香港久久久| 97精品在线视频| 啊啊啊啊啊啊啊啊在线观看| 97亚洲欧美| 亚洲 无码 偷拍| 国产品精品自在在线午夜免费| 日本成a人v网站在线观看| 色欲天天婬色婬香WWW夜色| 一级性爱视频免费观看 | 天天操福利视频综合网站| 国产农村妇女毛片精品久久| 天天操妹子| 深夜激情| 综合 亚洲 欧美| 日本孕妇一区二区视频操逼免费看| 思思热在线视频免费| www.伪伪| 91精品无码人妻系列| 97色在线| 91欧美偷拍| 丝袜高跟澳门91视频| 色777999综合| 久久 精品| 亚洲精品白浆高清久久久久久 | 91精品91久久久久77777| 午夜精品久久久久久久久久久久久 | 国产多人在线观看视频| 日韩一区二区三区四区五区| 久久久久久人妻| 午夜天堂精品久久| 日本黄页视频在线观看| 淫淫综合网| 午夜精品久久久久久久久久蜜桃| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 国产一区二区av综合| 啊啊啊操一区| 无码人妻精品一区二区三区九九 | 久久综合18p| 草b在线| AV男人天堂网| 久久伊人最新网址视频| 精品偷拍13p欧美dodk视频| 日韩av乱伦| 骚乳在线| 97中文字幕一区| 国产精品人妻一区二区| 亚洲精品无码少妇久久| 天天综合网~69| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 欧美 亚洲 在线| 少妇一级婬片免费放一级a性色.| aaa一级黄片| 91在线欧色| 997色在线| 精品高清av中文字幕| 日本黄 R色 成 人网站| 天天看特黄的免费网站| 殴美性天天| 夜嗨影院| 亚洲天堂自拍| 超碰91在线| 国产精品成人蜜臀AV在线| 中文字幕视频2区| 亚洲人综合19| 亚欧高清在线| 精品一久久久| 日韩9区| 亚洲成人久久美女| 在线情色电影 91大| 搡老熟女免费视频| 欧美制服网站美腿丝袜| 乱操9999| 国产精品无码av在线| 久久视网78| 黑人娇小av在线播放 | 青青国产在线拍揄自揄拍| 久草电影网| av在线免费一区二区| 欧洲乱码一区二区| 日日夜夜精品视频| 久久久久久欧美精品se一二三四| 97频视在线| av爱爱爱| 夜夜操91744565| 久久久久久九| 99爱精品| 一区二区三区男人的天堂| 人人操人人搞人人草| 91精品成人| 天天躁日日躁成人字幕aⅴ| 中文字幕一区二区三区蜜臀| 天天射夜夜骑| 国产精品大香蕉| 久久久涩| 操碰97| 怡红院成人视频| 日韩午夜啪啪视频| 狠狠爱夜夜干| A 天堂| 精品国产乱码久久久兰草影视| 国产精品在线一区二区| 丰满的三级少妇欧美久久久| 亚洲情色在线| 啊啊啊啊啊好大好舒服想要| 91色久| 在线视频97| 丝袜av一区二区三区| 观看免费区二区三区二| JULIA一区二区三区在线播放| 色综91| 国产日本顶级一区二区三区| baiduhicn.com。| 激情五月激情综合网| 人人妻人人狠人人| 国产自产一区视频在线| 精品无码一区二区三区| 国产91丝袜在线播放蜜月| 99这里有精品视频| 亚洲第一无码播放立川理惠| 免费的黄片有限公司| 久久久久人| 物业黑人 AV一区| 精品乱码久久久久| 国产精品久久久久久久黄无码| 精品九九九| 97免费视频在线观看| 天天操天天舔| 91天美| 懂色av一区二区三区天美传媒| 欧美色图自拍| 黑白配性爱AV成| 一区e区三| 亚洲色系另类精品国产| 91视频伊人| 国产专区第一页| 色yeye成人免费视频| 欧美做爰无码A片视频| 国产人妻天天干精品| 色综合网1| 高树玛利亚无码流出| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 色婷婷视频| 99色综合| 久久久久9999妇女| 操老熟女AV| 三级色影综合网| 蜜乳AV.COM| 一区二区三区探花在线观看| 亚洲97P| 国产农村妇女精品1区二区| 五月天婷婷基地| 国产盗摄美女如厕大神作品在线观看| 综合91网| 亚洲 欧美 色图| a v网站在线播放| 麻豆 欧美 日韩| 久久久专区| 亚洲美女av无码| 涩五月婷婷| 欧美性爱视频免费一区一A| av爱爱爱| 无码精品久久| 久久av一级av少妇av高潮| 精品一区二区成人动漫| 不卡一区视频| 国内毛片欧美香蕉精品| 中文自拍欧美影视| 99黄页网站| 欧洲特黄毛片免费看欧洲毛片| 亚洲乱码尤物193YW| 黄片免费视频2019| 性色生活片久久毛片婬片免费放女人一级毛片| 1204av韩国| 老司机福利社视频在线观看| 日日噜噜夜夜狠狠视频无| 狠狠狠一区二区三区| 天天日骚逼熟女| 欧美视频一区二区在线| 亚洲激情 欧美色图| 蜜臀99久久国产| 天天日天天干天天整| 伊人成人中文字幕久久网| 人人玩人人添人人澡免费| 亚洲 欧美 手机在线观看| 亚洲欧美激情另类色图| 少妇人妻在线| 国模吧 一区二区三区| 97 国产精品| av一区二区三区 中文| 中文高清一区二区的| 97天堂| 久久久久免费少妇| 国产又黄又粗的视频| 免费综合亚洲中文| 久久久久9999| 激情四射婷婷四五月天| 搞中出视频在线观看| 91在线视频国产网站| 久草综合京东| 欧美的性爱网站免费| 精品乱码久久久久| 97干在线视频| 性爱乱伦视频免费| 亚洲欧洲无码97久久精品| 国产99精品一区二区三区免费| 夜夜做夜夜爽精品视频| 中文字幕久久精视频久久大全| 中文字幕女同在线| 日韩啊V| 99久久综合网| 97精品国产精品免费观看| 日韩激情电影中文字幕| 97精品国产97久久久久久| 夜夜做夜夜爽精品视频| 国产在线视频二区| 久久久久久久人妻| 欧美久久婷婷| 久久亚洲天天做| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 成 人 A V免费视频在线观看| 玖玖爱影院| 九七超碰| 天堂精品| 欧美淫乱视频| 欧美性色欧美| 一区二区视频在看| 成人怡红院| 国产日韩精品suv| 免费av在线播放二区| 狠狠久久手机视频精品| 久操操AV电影| 亚洲最新av无码成人精品区| 97人人操人人摸人人爱| 人人干人人搞人人摸| 色人久久| 热久久这里只有精品| 天天日日舔舔| 精久久久91| 蜜臀无码一区二区| 欧美96在线|欧| 久久久999| 无码天天操| 亚洲成人美女无吗| 丁香啪啪| 亚洲人在线| 亚洲综合射| 97亚洲在线| 国产在线视频二区| 国产成人精品必看| 日韩性爱电影一区| 亚洲av在线免费观看| 自拍二页| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 亚洲欧美97√| 日韩三级伦理中文字幕|