亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

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
返回資訊列表
99久久综合网| 久久AV无码AV| 97色色色| 少妇高潮对白在线观看| 上海一级黄片| 在线无码视频| 色香欲影| 美女视频尤物网在线看| 欧亚日韩中文在线| 亚洲成a人v欧美综合天堂下载 | 997色在线| 久久麻豆一区二区| 日韩AV无码中文一区二区| 91天天综合日韩欧美| 国产性爱欧美性爱在线| 干B视频伊人网| 久草福利在线资源站| 国产一国产一级毛片古装| 国产热av| 物业黑人 AV一区| 精品无人区麻豆乱码久久久| 91色综合激情| 日日骚精品视频| 密臀在线免费观看| 91 丝袜在线| 综合亚洲情色| 不卡九肏| 97视频620| 大香蕉在线免| 97er欧美性| 国产剧情一区在线观看| 亚洲色图a| 久插综合| 热热色色综合| 插插综合网天天影视网| 91白虎| 国产成人啪一区二区| 伊人精品视频| 啊啊啊啊啊啊啊啊啊在线观看| 欧美日本久久精品一区| 91夜夜蜜桃臀1区2区3区| 久妇网| 欧美久久婷| 白丝1区2区3区| 久久久999网站| av情色影音| 久久久久久午夜男人的天堂| 中文字幕一区av| 色色色99| 999九九精品| 欧美A√综合网| 综合网亚| 91模特在线观看| 大香交| 亚洲色阁| 高清有码一区二区| 97在线精品观看视频| 中文字幕乱码人妻二区三区| 高清无码 国产精品| 日韩精品永久在线观看| 69超碰综合| 91男女啊啊啊| 亚洲人91| 亚洲熟妇综合久久久久久| 伊人久大| 成人免费视瓶| 亚洲国产一区二区入口| 亚洲精品亚洲人成人网| 日韩精品熟妇| 亚州熟妇精品| 青青五月天| 欧美高清在线| 大香蕉久久| 91AV入口| 超碰在线99| 97干com| 按摩中文字幕| 日本高清加勒比| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 伊人网综合在线视频| 人妻 中文 日韩| 婷婷伊人网| 成人五月香网在线| 日韩资源网| 国产夫妻性生活视频| 91操熟女| 欧美 亚洲 偷拍自拍| 男人天堂2019亚洲| 2017天天透天天通天天擦| 国产国产亚洲一二三久久| 青青在线视频日韩欧美| 蜜乳性色无码专日粉嫩骚逼AV| 五月婷婷激情| 91嫩草在线| 天天久久| 色香色欲天天综合网天天来吧| 久热超碰| 97欧美色| 国产成人综合在线播放| 999久久久久久久精| 日韩欧美中文字亚洲慕| 一区操逼日比视频| 亚洲色图 欧美热图 清纯唯美 另类自拍| 欧美成人国产精品| 成人97人人超碰人人| 亚洲人成网www| 中文字幕精品专区搜索结果91| av网站免费看| 嗯啊不要啊在线 | 亚洲青色欧美| 日本欧美一区二区三区视频麻豆| 大鸡巴久久久| 日韩精品在线视频,日韩精品……| 久久久久久AⅤ无码免费肉站 | 91色香| 中日韩欧美精品无码AⅤ一区二区| 女同在线视频一区| 97在线免费看视频| 毛片电影一区二区三区| 久久久久99精品成人片蜜臀| 日本岛国黄色网址| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 亚洲欧美综合| 久99久视频精选| 免费精品AB| 亚洲午夜福利视频| 伊人欧美大香蕉视频| 色色香蕉| 伊人嫩草| www久久99| 青青草女人天天干| 2011国产精品| 92性色国产午夜福利在线661| 亚殴在线| 黄色免费网页无码| 91N综合网| 大奶啊啊好爽 | 美日韩男女操屄视频| 日本伦理一区二区| 国产性爱在线视频一区二区| 99黄页网站| 国产第25页在线观看| 美女让帅哥通她小鸡鸡| 91色久| 超碰97伊人| 67914亚洲精品| 天天综合~91| 综合91网| 婷婷久久五月| 精品国产一区二区三区四区在线看| 欧美se亚洲| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 欧美亚洲国产日本在线,久久精品国产| 中文色综合| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 久久久久久九九九九九九| 熟女六十路| 777超碰| 九九九九日本 | 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 闷骚老熟女15P| 欧洲欧美视频一区二区| 亚洲高清欧美总合| 亚洲自拍一区夜夜操| 亚洲国产麻豆一区二区三区| 综合网天天| 综合91网| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 久草婷婷| 香蕉久久国产AV一区二区| 欧美国产婷婷久久| 嗯嗯啊啊日韩精品| 亚洲18禁| 色999亚洲人成色| 国产偷人伦激情在线观看| 久久6热精品99视频| 韩国一级做A片免费的| 性感美女91影视| 又摸又舔在线观看网站| 久久久精品国产亚洲伊人| 九九精品无码专区免费| 精品人妻一区二区三区四区不卡在| 四虎884a| 欧美色图片91| 在线黄页看毛片| 黄色性爱网网| 欧美精品99久久久**| 亚洲久9| 欧亚韩国999| 91电影色诱| 久久精彩视频9| 爱我干综合| 中文字幕一区二区韩| 成·人免费午夜在线观看| 亚洲国产精品久久久久婷婷老年 | 亚洲无码太久| 99久久久久久亚洲精品不卡| 无码高清操逼网址| 国产精品久久久久久亚洲色欲| 91九色丰满高潮| 330dv亚洲成年视频网| 神马视频久久久久久| 日本三级韩三级99久久| 围产精品一区二区三区视频播放| 一起草日韩| 乱伦一区二区三区‘| 欧美组图日韩亚洲中文字幕| 内射老妇BBWX0C0CK| 国产白丝精品在线观看| 国产老太乱伦一区| 久久78| 色妺妺AⅤ| 婷婷人妻激情| 亚洲性爱成人| 欧美日韩国产高清在线一二三区 | 91人妻PORNY九色大屁股| 懂色av色欲av蜜臀av| 欧美日韩另类在线| 综合久久久久久久综合网| 亚洲另类欧美精品| 男女激烈网站最新| 亚洲成a人片在线观看中文!!!| .精品人妻一区二区三| 国产精品久久久久无码Av网曝门| 久久国产免费激情视频| 色吧综合网| 国产玖玖| 91成人国产综合久久精品蜜月| 欧美色就是色| 日本黄大片在线观看视频| A片A5445444| 18禁免费视频| 欧美日不卡| 超碰97在线 欧美 国产| 亚洲中文字幕一区| 中文字幕三四五区| 精品久久久久久AV无码| 亚洲Av无码成人精品国产| 色色亚洲| 天天看人人操屄犊摸阴| av草草在线电影| 国产91丝袜 在线播放| 99久久精品无码一区二区毛片免费| 成人乱人伦一区二区| 黄色小视频日本txt| 丁香六月激情综合| 国产精品久久久999| 久久99久久99精品天美传媒棢·纸:. | 中文字幕人妻丝袜乱一区三区| 啊啊啊啊网站| 免费作爱一级视频| 97干色天堂| 色香综合天天影视综合 | 日本熟女不卡视频| 首页亚洲国产高跟丝袜诱惑视频| 性老妇一区二区三区| 色97国产69香蕉| 精品免费一区| 日韩黄色成人性爱| 欧美一区二区传媒| 9Ⅰ超碰| 美国精品国产精品| 九月丁香婷婷| 日韩日韩日韩-国产乱码精品一区二区| 日韩电影在线观看网址| 婷婷色网| 日本媚薬中文字幕在线| 午夜福利免费福利视频| 麻豆性爱视频在线播放| a级免费在线观看| 再深点灬舒服灬太大了好硬好爽| 成人久久久精品| 成人精品无码| 99热这里| 亚洲极品| 日本日皮视频逼| 亚洲第91页| 亚洲自拍偷拍视频在线| 美腿色图| 国产精品人妻无码久久久互動交流 | 国产精品美女在线一区| 五月婷婷hd| 91精品国产91熟女| 深夜激情无码| 日本国产二线女色| 天天色天天干天天射| 国产视频三区四区| 欧美高清色| 激情综合色| #NAME?| 国产女性无套 免费观看| 在线观看视频91| 欧美gv在线观看| 欧美一区二区在线资源| 伊人久久综合影院精品久久久| 91在线页| 又大又大又大又粗爽高潮观看| 亚洲精品亚洲人成人网| 欧美日韩狠狠爱| 国产精品亚洲美女久久久久| 久久97视频| 久久综合九九| 人人操欧美风骚| 视频在线观看一二三区| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 91网站18| 成人老鸭窝人人在线视频| 亚洲天堂一区| 亚洲三级网址久久最新| 日本免费人成视频播放120秒| 亚洲A色| 欧美成人A√在线一区二区| 麻豆九九九| 国产99精品一区二区三区免费| 免费看污网址| 99超级碰免费视频| 免费在线看黄片av| 日韩欧美天天爽爽爽天天爽爽| 亚洲高清无码在线桃色| 就去色综合| 天天影视网综合少妇| 97超碰碰| 亚洲精品不卡一二三区| 鲁鲁色综合网| 日逼国产| J?P?NESEHD熟女熟妇伦| 日韩78m视频| 777奇米影视777四色| 超碰97COm中文| 色999人与兽| 99这里只有精品国产| 精品久久久不卡一区二区| 综合自拍| 13小男生GAY自慰脱裤子| 撸撸成人在线视频| 中文激情网| 中文字幕97| 久久精品国产久精国产| 综合网,亚洲,欧美| 91在线无码精品秘 软件| 精品天堂| 青青草国产一区二区三区| 蜜桃视频精品一区二区| 国产91久久九九免费精品无码| 欧美天天| 国内外毛片在线观看| 北条麻妃99精品青青久久| 97超碰公开| 熟妇艹鸡八| 久久一区二区三区入口| 另类亚洲一区二区三区| 九九九九九精品视频| 欧美韩国你懂得在线| 曰韩精品九九无码| 国产操逼逼网| 欧美大波激情xxxx| 大香蕉欧美| 天操天操夜操夜月操月年年操操| 欧美性战999| 亚洲无码色| 亚洲第一精品在线视频| 日韩三级在线观看网站| 日本不卡二区| 丝袜亚洲综合| 久久亚洲一区女同性恋中文字幕| 涩涩久久精品| 欧美97在线观看| 亚洲欧美精品91| 26uuu国产免费观看| 一级二级三级黑人无码| 一区二区三区国产在线播放 | 2024年最新色情网站在线观看| 亚洲熟女一区二区| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 精品91日日夜夜超清资源| 伊人9| 亚洲国产青青| 熟妇高潮精品一区二区三区下载| 天天日日本| 日韩一999精品| 亚洲色图超碰在线| 91丨国产丨白浆| 色五月综合| 日本99热| 四虎影库国产精品免费| 国产一级久久久| 欧美大码在线视频| 99啪啪| 久久天天躁日日躁狠狠躁 | 亚洲国产精品无码AV久久久| 亚洲欧美高清无码| 久久久一区二区三区三州| 天天上日日上日韩精品| 国产精品免费1区2区视频| 成人羞羞视频国产| 欧美亚洲国产91在线| 久久精品国产精品一区| 粉嫩av久久一区二区三区| 欧洲亚洲国产综合在线| 天天操夜夜嗨| 中文字幕性感少妇av| 亚洲精品精品一区二区| 九九九九久久久| 婷婷四五区| 久久仑合| 久久成人午夜狠狠| 超碰碰97资源站| 精品福利| 日本国产欧美高清在线| 99色综合| 综合网欧| 欧美色道啊| 国语少妇精| 欧美18 在线观看| 在线观看AV片| 25国产精品免费观看| 啊啊啊好湿国产一二| 久久超碰免费的| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 国产精品69人妻无码久久久| 亚洲女毛多水多21P| 狠狠色婷婷7777久| 久久水蜜臀亚洲AV无码精品| 色网亚洲人| 色欲天天综合久久久无码网中文| 操逼逼中文字幕| 大香樵伊人网| 综合av影片| 久久久久久人体| 岛国福利在线精品播放| 在线看免费无码AV天堂的| 91在线美女| 色阁阁AV综合网| 精品欧美乱码久| 久久久精品91八戒| 青青11操操操操操操操操| 91/欧美| 清纯唯美第一页| 国产三级资源在线观看| 熟女性视频| 色网1| 精品无码欧美三级| 99热久| 超碰免费欧美7| 丁香色狠狠色综合久久小说| 亚洲国产欧美中文永久| 天天日天天屌天天操| 午夜操一操| 亚洲无码一区二区三区三州| 国桃视频产巨乳精品一区二区在线| 男人久久天堂| 免费一级视频特黄色大片| 欧美色图成人网一区二区 | 色爱综合网| 日本高清熟女久久一区| 性爱综合一区二区| 99re这里只有精品3| 欧美综合自拍亚洲综合图| 操人人| 国产怡红院| 97狠狠| 五月婷婷激情综合| 日韩人人精品| 国产精品久久久久久片| 亚洲国产蜜臀系列在线观看| 国产精品一区午夜福利| 亚洲涩涩| 性爱乱伦网址| 伊人嫩草| 丁香六月婷婷久久综合| 国产人妻久久精品一区二区三区| aaaa黄片| 91狠狠狠| 99在线精品视频| 狠狠色五月亚洲91| 婷婷六月色| 日本韩国五十路六十路七十路老熟女作爱视频网站 | 性开放中文AV高清无码免费看| 久久国语| aⅴ日韩成人电影av在线免费看av大全| 亚洲 另类 丝袜 自拍 动漫| 日韩三级天堂在线观看| 精久久久| 激情文学网伊人| 舔足天天操天天射| 人人爽夜夜操| 国产成人欧美一区二区三区的国产| 97天天弄| 簧片免费看视频| 理论久久婷婷网8| 不卡在线一区,精品一区二区三区中| 欧美日韩在线小说 | 日韩一区二区熟女| 国产AV精久久| 欧美综合色| 精品妇女一区二区三区| 精品日韩中文在线| 91 国产丝袜在线播放-百度| 九九综合久久| 成人免费性爱视视| 神马影院午夜福利久久久| 久久国内| 麻豆成人影音在线| 天天日天天射天天干| 女人被男人桶爽视频网站| 热久久无毒不卡| 亚洲 综合 欧美| 久久综合国产精品国产| 亚洲精品九九九九九九| 熟妇高潮一区二区免费视频| 国产AV激情无码久久无码| 亚洲,欧美,综合网| 午夜福利在线视频1000| 久久激情五月| 精品成人动漫一区二区| 五十路熟女人妻一区二区三区四区五| 日韩精品人妻中文字幕久久久| 动漫爆乳3D奶水一区在线观看| 超碰免费人妻在线| 欧洲精品区| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 久久久久久久精| 欧洲亚洲人人爽爽视频| 人妻天天爽夜夜爽爽| 夜夜影视四色| 人人做,人人操,人人摸| 久热热| 91女优在线观看| 亚洲另类久操网| 日韩性爱网址| www.91理论| 久久成年片色大黄全免费网站| 亚洲AV不卡在线观看| 日韩二三区| 任你艹| 精品毛片久久久精品毛片| 亚洲巨爆乳一区二区三区四季网| 青青草一本道福利视频| 国产第二页| 久久免费看高潮毛片韩国| 日韩九区| 91人妻Pr| 可以免费观看的日韩av毛片| 自拍偷拍草一草| 精品一级毛片在线观看| 国产97视频| 色欧美色交综合| 在线中文AV| 久久久久密臀一区二区| 91美女视频在线| 欧美三级一级| AV色天香在线| 欧美精品成人亚洲| 午夜男人天堂| 色av中文字| 亚洲色图超碰在线| 天美国产三级传媒| 视频二区美腿丝袜制服人妻欧美 | 97欧美综合网| 日夜精品| 久久91| 污色区网站| 999久久久| 屁股久久久久久久| 婷婷色综合欧美日韩| 丰满人妻一区二区三区色-百度| 亚洲高清综合网| 高清视频一区| 欧美中文字幕精品人妻| av中亚| 91视频精品| 亚洲精品免费中文字幕| 亚洲精品xxx| 欧美日韩国产高清在线一二三区| 欧美久久伊人| 桃色五月天| 黄页18禁| 久久动漫精品视频这里只有精品| 欧美激色| 人人妻人人澡人人爽人人精品浪潮| 91熟女丨91老女人| 久久久性| 九九久久一区二区伦理| 综合久久中文字幕综合日韩精品| 久久99久久99久久99人受| 亚洲一区二区麻豆影院| 91美乳| 超碰免费欧美7| 老熟乱一区二区三区四区| 欧亚日韩中文在线| 国产婷婷综合在线观看| 综合免费无码中文| 色婷婷五月天| 乱老熟女一区二区三区| 欧美一区二区三熟女剧情| 欧美中日韩XXXX| 亚洲在线网站| 亚洲各类熟们中文字幕| 狼人综合婷婷激情四射 | 九久久九精品视频| 九九九九九九九| 偷拍盗拍亚洲色图图片| 精品视频免费在线一区| 九九色逼| 国产精品天干天干综合网麻豆| 青青草原香蕉日本Ap| 日韩三级在线观看网站| 国产高清无码一区二区三区四区皇冠| 欧美午夜精品久久久久久3D| 色五月激情AV在线| 国产无码精品无码| 女人高潮大叫一级毛片| 色婷婷婷五月天激情四射| 日韩欧美麻豆| 操逼国产免费| 偷拍伦理视频| 国产精品一区二区麻豆| 国产成人拍国产亚洲精品| 色婷婷久久| 人妻熟妇久草在线| 日韩激情电影中文字幕| 丁香六月啪啪| 免看60秒涩涩视频| A V视频日本| 日韩一999精品| 欧美日韩亚洲少妇寂寞影院正在播放| 激情抓乳插进去啪啪啪日韩| 欧美另类色| julia国产在线| 久久久无码av精| 欧美后入视频| 四虎午夜影院| 伊人五月天青青草婷婷| 热99re69精品8在线播放| av天堂手机版追回 | 国产一区二区啪啪视频| 亚洲素人网| 波多野结衣一级视频| 日本一区二区三区欧美日韩中文字幕| 男人的天堂99| 免费看日本操逼视频| 日本免费一区二区不卡| 先锋色眉乱伦资源| 殴洲老熟女| 国产精品4p在线观看| 久视频在线观看| 九九无码| 9久久9综合| 人人操欧美风骚| 国产日本熟女顶级一区二区三区视频 | 91超碰在线观看| 亚洲一区二区三区四区视频| 日本最新1区2区3区| 污污汅18禁网站在线永久免费观看| 欧美最婬乱婬爆婬性视频| 91久久青青草原精品| 99re6久热只有精品6在线直播| 久草成人| 91在线视频免费中出| 少妇一级无码精品| 青青草国产盗摄一二三区| 乱伦a片视频| 亚洲熟久久| 人人妻人人狠人人| 日本精品加勒比海一区| 亚洲五月丁香花狠狠干一区二区三区| 天天综合色图| 97干com| 18禁中文字幕| 人人操人人精品影片| 国产超碰人人操| 啊啊啊啊啊啊在线| 欧美色图亚州激情| 国产人妖视频一区在线观看| 青青草国产一区二区三区| 亚洲国产日韩欧美熟妇在线| 久久久日本电影| 欧美日韩人人精品| 九九干| 精品人妻少妇| 美女97超碰| 国产色精品午夜大片| 人妻少妇精品无码专区二区密桃| 水澄无码AV| 欧美偷拍区| 久久久久久中文| 精品女人999| A 在线网址| 夜夜高潮夜夜爽夜夜爱爱一区| 蜜色网色哟哟| 五十路三级片| 99re这里只有精品9| 嗯嗯啊啊视频一区二区三区| 免費黃色視頻觀看一| 97亚洲综合| 国产性爱欧美性爱在线| 婷婷大香蕉| 超碰色男人操熟女| 97超碰9| 97这里只精品| 青青爽| 欧美视频边做饭边橾| 日韩欧无码一区二区三区免费不卡| 综合欧美日韩在线| 久久思思热| 草草影院最新网址| 久久久中文| 亚洲极品| 久草综合视频| 亚洲精品一二三四区| 殴美大黄片| 成人自拍三级在线观看| 中国特猛少妇色xxx| 五毛骚逼极品美女怕怕| 亚洲s在线观看| 婷婷五月天久久久| 四虎影视永久在线免费| 国产一区二区三区高清视频| 一级AAA片一区二区三区| 色网综合网| 东京热一区二区三区四区五区六区| 在线国产探花| 日韩AV无码中文一区二区| 国产二区三区免费视频| 老熟女91视频| 在线天堂资源亚洲| 久久精品人妻一区二区三区| 夜夜福利| 亚洲精品欧洲精品| 久久久久密| 免费观看欧美日韩操逼视频| 久久久国产成人一区二区三区在线| 91碰超| 国产精品国产自产高清AV| 国产精品久久aV| 久热一区二区| 青青草福利视频| 精品天堂| 碰碰97| 亚洲无 码A片在线观看麻豆| 97天天综合| 激情色图| 欧美影院一区二区三区| 97免费在线视频| 男人的天堂 在线一区| 久久这里只有精品9| 超碰九7免费| 丁香九月婷婷| 免费岛国一级片| J?P?NESEHD熟女熟妇伦| 国产精品美女久久久久久网站| 91黑人狂躁丰满熟妇| 久久国产成人精品国产成人亚洲 | 久久熟女人| 91九久| 内射黑人| 欧美激情色婷婷花野真衣一区二区 | 2021国产成人精品久久| 久久久久久久强迫| 亚洲无码国产探花在线观看| 少妇一级婬片免费放一级a性色.| 91香蕉视频在线观看免费| 午夜一区二区三区国产| 黄片aaaaa一区| 青娱乐日韩无码| 亚洲人成网www| 夜夜嗨AV蜜臀av| 日本大香蕉| 国产中文字幕在线| 9Ⅰ老熟女| 蜜乳视频网站| 色情乱伦AV| 超踫中文字幕| 久久一二三四不卡 | 国产美女口爆吞精| 人妻天天爽夜夜爽2| 欧美 亚洲| 最新av中文字幕高清| 无码精品人妻一区二区三区妖精| 成人国产精品三级A片| 日本三级久| 色九九九九| 美女黄页网站| 亚洲欧洲日本精品中文a∨| 亚洲αv一区二区三区| 夜夜肏2021| 亚洲熟女一区| 不卡在线观看视频| 久久无码成人| 五月婷婷六月丁香| 亚州中文字幕超碰97| 日韩99999| 青娱乐亚洲自拍| 欧美激情总合网| 天天干夜夜肏| 国产无码久久高清| 91色色色| 亚洲网污污污污| 欧美精品三区| 综合激情婷婷| 天天操美美| 亚洲中文字幕熟女| 久久99亚洲精品久久99果| 97大色网| 久久人妻| 伊人五月天| 999 久久久| 黄色免费网| 亚洲欧美精品91| 伊人少妇久久久| 无码高清操逼网址| 久久久蜜桃一区二区三区| 欲色啪| 在线免费观看日韩一区| 天天干天天操天天拍| 蜜区区视频79| 国产精品探花视频| 狠插 制服 自拍| 天天综合网日韩| 久久伊人大香蕉| 亚洲综合大片| 中文字幕一区二区三区高清| 国产白嫩精品久久| 超碰95| 日韩一区二区精品视频| 婷婷性网| 久久久久久久久久8888| 超碰视97中文| 黄色av片三级三级三级免费看| 老汉网| 久热在线精品免费观看| 综合网~91综合网| 亚洲欧美国产中文视频| 人妻夜夜爽天天爽麻豆三区网站| 97欧美日韩| 男人的天堂啪啪啪啪啪蜜桃不卡| 天天综合网~91| 亚洲激情av| 日本一卡二区在线| 亚洲图片欧美在线视频| 情色图区| 色五月婷婷网| 久久精品久久久久久久| 亚洲色图大香| 少妇久久久久久久久| 亚州少妇| 家庭乱伦国产精品| 亚洲精品天天影视综合网 | 久精品无码av一区二免费国产在线观看| 久久人妇| 草莓精品视频| 中文有码9| 裸体美女免费看网站青草| 亚洲色交| 青青草亚洲一区| 亚洲精品一区二区精品| 欧美国产操逼| 欧美综合区| 最新制服中文第一页| 色综合一区二区三巨| 黑人娇小av在线播放| 久艹伊人精品综合在线| 波多野结衣被操50分钟免费视频| 欧美色图 人妻| 熟妇操花| 中文字幕欧美丝袜07资源| 大香蕉伊人一区在线观看| 国精精品无码一二三区水多多| 高潮9999外国| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 婷婷丁香在线| 久久国产成人精品国产成人亚洲 | 国产大陆天天艹| 精品一区99999| 96精品在线| 免费人成在线观看网站品爱网| 美女网站黄页| 五月黑AⅤ| 日韩一区二区精彩视频| 亚洲有薄码区久久在线一区| 91亚洲人电影| 操逼国产免费| 久久久久久久唑| 丝袜视频一区二区在线播放国产中文| 一起草精品人妻| 国产精品美女视频诱惑| 综合九九| 日韩99999色| 人妻在线视频| 日本中文字幕不卡视频| 欧美精品欧美精品系列| 日本少妇va7777| 99热只有这里有精品| 91久久青青草原精品| 日日夜夜模| 偷窥自拍亚洲色图| 日韩欧美字幕亚洲一区二区| 激情综合网亚洲| 超碰视97中文| 97超碰色屌| 激情五月天婷婷| 久草国产在线视频| 97在线免费观看| 高潮9999外国| 精品国产国产AV| 日韩精品三区四区| 亚洲色综合| 极品尤物自安慰| 另类图片欧美激情综合| 欧美亚州综合网图片| 欧美综合网1| 嗯~啊~快点 死我视频| 亚卅熟女乱色| 国产免费操逼| 偷拍三区| 国产福利一区二| 少妇淫妇久久久久久久| 久久久久久无码人妻中文字幕| 成人A片男人的天堂| 区日韩亚洲乱码av电影| 日韩国产中文字幕| 中文字幕123| 一级片在线观看高清无码| 色呦呦国产精品免费看| 搡老女人老91二区| 97ai亚洲| 97伦综合| 人妻蜜桃臀| 亚洲欧美变态| 玖玖爱伊人玖玖爱| 国产女人9999| 囯产精品强| 日本一久是| 欧美亚洲国产日本在线,久久精品国产| 97干色天堂| 九九九九九九九九九九九免费国产| 日本狠狠干| 99爱精品| 骚逼高潮久久精品| 国产原创自拍| 欧美亚性天堂| 无码99| 久久久久久久 九九九九九九九 | 国产隔壁老王影院在线| 久久草草亚洲蜜桃臀| 台湾一区国产高清在线| 国产精品免费久久久久久久久久| 欧美夜夜| 人人看人人插| 思思热在线cao| 美女午夜福利免费视频| 天天视频综合在线观看视频| 久久久 国产精品| 看一级黄色视频| 狠狠操狠狠| 亚洲综合色男人网| 淫色网综合| 又摸又舔在线观看网站| 亚洲黄色网址| 青青草一区二区三区四| 欧美亚洲首页| 激情小说在线视频| 国产无吗在线播放| 国产一区二区三区视频在线看| 久久91视频| 静品嫩模一区二区| 殴美,日韩国产伦精品| 97资源欧美| 亚州国产成人精品女人久久| 亚洲第一页色网| 91操熟女| 国产亚洲女v在线观看| 欧美性爱精品一区二区| 超碰三级秋霞| 欧美97视频| 日韩本不卡视频在线观看 | 波多野42部无码喷潮在线观看 | 亚洲风情综合网| 免费一二区| 浪人综合网| 五月天婷婷成人网| 色婷婷婷五月天激情四射| 一区超碰一区| 天美精品原创av片国产| 亚洲成人无码影院| 先锋精品av色鲁| 欧美亚州综合图片| 青草精品视频一日本久久久久网站| 中文字幕丰满人妻日本| 女人喷水视频在线观看| 中文字幕人妻丝袜| 欧美色图91p| 日本一二区不卡| 中日韩欧美精品无码AⅤ一区二区| 国产在线76页| 91欧美巨乳| 日本精品一级二级三级| 99热只有这里有精品| 四虎 精品 WWW| 神马久久免费电影观看| www.亚洲成人一区| 久色网| 亚洲宗合网| 91丨国产丨白浆秘 洗澡动漫| 中文字幕精品资源在线| 中文在线久久字幕| 午夜男人的天堂| 人人妻人人狠人人| 久久久久久久久九九久孕交| 神马麻豆福利院| 91强奸乱轮| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 国产熟女无套内射| 成人无遮挡毛片免费看| 午夜亚洲WWW湿好大| 日韩av乱伦| 色老久久| 久久受www免费人成| 无码免费一区二区三区啪啪| 久久久少妇诱惑精品视频| 2019精品国产无码成人| 日韩在线视频1234| 97在线观看视频| 黄色小视频日本txt| 91国产大片| 中国一级αV| 色色色热| 精品无av| 国模精品一区二区三区苹果色戒| 久久同城AV| 国产精品点击进入在线影院| 熟妇人妻一区二区| 婷婷婷婷婷婷久久久久| 亚洲天堂,男人| 亚洲欧美清纯| 91性高潮久久久久久久久| 99精品丰满人妻无码| 最新中文字幕精品在线| 欧美aⅴ99久久黑人专区| 青青青国产手线观看视频2| 青娱乐 成人娱乐在线| 97综合久久| 欧美少妇大量自拍视频在线观看| 久久久久久九九九| 人妻久久久久久久久久久久久久久 | 91AV天美在线视频| 日本狂喷奶水在线播放212| 九九拍拍精品视频在线播放| 亚洲密乳AV| 亚洲天堂日本| α√在线| 国产美女91| 欧美激情综合色综合啪啪五月| 精品国产乱码久久久| 成人欧美一区二区三区黑人一| 综合色91| 国产精品对白内射| 97超碰磁| 久草草一二三四区久久| 久久一级无码精品毛片6| 91精品久久久久久77777| 国产 v乱码一区二| 91高清欧美| 亚州操操穴网| 91一区二区三区蜜桃| 国产丰满少妇久久久精品影院| 国产精品久久99日日| 国产又长又大又粗的视频| 99视频内射三四| 大香蕉伊人网| 亚洲诱惑| 狠狠色综合网| 2024年最新色情网站在线观看 | 色欲三区| 99re在线视频这里只有精品| 色色激情五月天| 性无码专区2020| 动漫av中文| 日本在线一二| 大香蕉乱级| 超碰97综合网| 搡老女人老妇女老妇老熟女怎么读| 国产乱伦亚洲| 亚春色色| 色狠人在线99| 综合久久欧美| 成人小说另类在线| 免费99精品国产自在在线| 2010男人的天堂| 久久精品欧美一区二区三区不卡| a级理论午夜日本| 亚州色图欧美| 五月丁香色综合| 欧美性爱无码一区二区三区| 亚春色色| 99热免费精品| www.色五月| 五月婷婷六月丁香网址| 日韩猛交| 日韩精品影视| 精品一区96| 国产动漫操逼视频| 偷拍三区| 超碰色老头| 搡老熟女国产1000部| 丰满少妇一区二区三区专区| 亚洲欧美日韩精品久久久一区二区| 91青青草| 91天美免费| 在线观看视频91| 一牛影视久久久一区二区三区| 国产福利av精彩对白| 国产家庭乱伦表演| 少妇精品| 福利大香蕉| 青草香蕉网| 综精品久久久aaaa| 99精品在线观看| 国产 亚洲 丝袜 制服| av爱爱爱| 亚洲人妻在线精品| a啊啊啊啊啊啊啊啊一区二区| 91强在线播放| 人妻一区久久二区三区色播| 人妻啊啊人妻啊啊| 一区二区娱乐网站| 国产www色在线观看| 国产多人在线观看视频| WWW.操逼.COM| 香蕉综合网| 肥佬影院91| 东京太热男人的天堂久久久| 999九九九九国产动| 欧美日韩人妻婷婷一区| 亚洲天堂第一页| 嫩草 人人网精品| 亚洲日产专区| 人人天天欧洲| 亚洲成人在线播放| 香蕉久久国产AV一区二区| 搡老熟女老女人老熟妇免费视频| 久久久久久久亚洲Av无码| 91人妻最真实刺激绿帽| 成人无码在线视频网站| 婷婷久久五月综合激情| 色姑娘综合网| 密乳视频在线| 国产精品人妻无码久久久互動交流 | www久久国产精品| 日本国产欧美一区三区二区 | 超碰亚洲欧美日韩无| 中文字幕二区日韩天堂| 人妻激情另类| 有码免费观看| 久草精品国产蜜臀| 蜜桃精品视频一区| 综合欧美日韩在线| 久久网亚洲| 亚洲欧美97√| 精品国产乱码久久久久久蜜臀|