色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合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
返回資訊列表
99自拍视频| 91新在线欧美| 色婷婷电影| 91青青| 情侣开房子拍 日韩无码 女的很漂亮| 13小男生GAY自慰脱裤子| 欧美激情久| 黄片无码在线制服| 成人 日本A片无码8888| 天天日天天干天天操| 综合网久久| 中文字幕日本久久| 日韩在线一区二区| 熟妇一区,二区,三区。| 日日夜夜骚| 日韩中文字幕二区| 加勒比在线观看一区二区| 亚欧操逼片在线观看 | 九九久久99| 97亚洲色图| 熟女中出视频| 嗯啊免费视频| 蜜臀av一区二区三区免费观看| 人人操人人操人人人操| 亚洲网站一区二区在线| 久久精品无码熟妇一区二区三区视频导航| 超碰99热中文字幕| 久久国产精品,久久国产| 亚洲色欲天天人妻无码系列专区| 大香蕉综合| 国产福利小视频高清在线观看| 超碰97COm中文| 超碰1997| 97在线观看免费视频l| 四季AV综合网址| 九久9精品| 久久的免费性爱视频| 久草看看看| 亚洲污污网站| www.高清无码诱惑一区.com | 伊人久大| 麻豆熟妇乱妇熟色A片在线看| 性交一区二区在线播放| 伦理弟一页| 亚洲av综合色区无码一| 91福利网在线观看| 国产黄片精品在线| 激情黄色片在线观看| 色欧美亚洲| 综合色区偷拍| 外国免费性情大片| 日本一区二区中文字幕久久| 成人毛片免费| 98人妻精品一区二区色欲| 97色网| 亚洲视频精选| 日韩免费中文字幕视频| 精品国产一区二区三区香蕉欧美| 国产偷人伦激情在线观看| 亚洲一区二区av| 玖玖资源视频一区二区三区| 亚洲se91| 欧美亚洲素人制服精品| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 午夜超爽| 无码抄逼网| 欧美三级中文字幕hd| 日韩欧美综合激情| 国产又操| 夜夜操2028| 伊人五月天青青草婷婷| 在线综合 亚洲 欧美中文字幕| 91视频成人福利网站在线一区| 久久亚洲不卡一区二区三区| 内射中出日韩在线观看视频| 91欧美性| 亚洲天天天| 亚洲熟女人妻中文字幕一区二区| 一道α片欧美| 亚洲无线码一区国产欧美国| 久久久久久久少妇| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 色综合色色| 麻豆60秒| 夜夜免费视频| 极品另类| 色官网色综合| 亚洲天堂另类小说男人| 日韩人人精品| 人妻天天爽天天爽三区| 久久久精品视频免费观看| 99视频只有精品| 91美乳| 少妇高潮喷水无套久久久久久| 精品一级| 色综合av男人天堂| 好湿好紧好爽 视频| 国产综合久久久鬼色| 亚州图片第一页| 国产农村妇女精品| 天天日B夜夜干B时时操B| 99热精品在线观看| 97就爱干| 91人妻最真实刺激绿帽| 午夜免费福利视频一区| 色婷婷蜜臀av| 丁香五六月啪啪| 成人资源中文字幕在线观看天天| 久草成人影片| 操美女高潮抽搐白浆| 欧美成人精品一区二区三区| 99热欧美| 91在线精品| 青青草视频导航官网| 国产精品伦理| 国产精品无码在线| 99re在线观看| 久久亚洲中文字幕视频| 精彩国产视频播放1区2区| 97天天在线| 中文字幕在线免费观看| 五月大香蕉| 久湿久久| 色乱二区| 久久久91福利姬| 日本性爰一道本| 久操B网| 超碰97男女| 精品人妻av在线播放| 五月天开心网| 麻豆久久精品亚洲精品88| 多乙久久久久久| 久干网| 中文字幕一区二区三区字幕| 成人久久无码www| 久久久久久久9| 夜夜操一区二区| 97精品一区二区视频| 五月婷婷久久综合| 欧美在线亚洲| 激激五月| 免费av在线播放二区| 欧美日韩性感| 日韩精品国产一区二区| 天天日美女的B| 天天操天天射天天日| 小骚逼被操的爽不爽| 黑人美精品 A片| 91久久久老司机| 黑人操一区二区| 亚州色图片在线色| 色综合五月天| 免费成人在线观看91| 996热| 先锋女优在线观看视频| 国产在线不卡导航| 国产黄片精品在线| 日韩色香| 亚洲成人精品久久久| 九九精品无码专区免费| 精品人妻高清麻豆av| 色嘟嘟人妻天堂网| 久久鲁干| 狼人狠干| 九九九九九九成人| 操逼网站视频漫画国产| 久操国产在线| 九九热av| 久久久96精品| 美女主播色欲91抠b在线播放| 婷婷五月天激情四射| 高清国产成人无码| 操屄日韩| 伊人专区一区二区三区| 欧美人与动性人交a| 久久成人午夜狠狠| 歐美一級亂黃99在綫精品| 五月婷婷丁香| aaaa少妇高潮大片| 乱伦图av| 国产精品极品美女视频| 国产欧美在线观看免费观看| 国产成人精品必看| 无码一区免费在线不卡| 啊啊啊啊啊好多水| 精品一区二区三区18| 国产精品丝袜久久亚洲不卡| 日本人妻一区二区| 精品久久青青草| 91人妻PORNY九色大屁股| 少妇一区二区三区高速| 最新国内自拍av免费| 91n欧美| 一本色道熟妇| 亚洲毛片久久| 日本不卡一二区| 青久久| 午夜精品久久999热蜜桃介男人用| 五月久久HDAV| 91爱综合| 久久久不能久久久久| 爽爽淫人网| 欧美久热| 啊a一区在线| 激情丁香五月婷婷| 亚洲 日韩 欧美 国产综合体| 色综合九九| 熟女突然公开看18禁影片| 留下AⅤ黄色片| 亚洲一级特黄大片在线播放91| 国产午夜福利电影免费在线观看| 免费A片三p视频| 视频国产欧美在线播放| 五月天婷婷在线看| 亚洲欧洲日韩天堂av| 韩国三级一线观看久| 美国日韩黄片| 日本国产欧美高清在线| 国产久久一区二区午夜| 欧美图片色综合| 色情亚洲日本成人| 91色堂| 国产精品高朝久久久久久久| 成人无码欧美一级A片狼牙直播| 青青草这里只有精品| 国语精品av| 亚洲色图欧美色图另类图片| 国产欧美日韩一区二区三区| 日韩av不卡在线观看| 99re在线观看| 无码久| 老色鬼成人精品视频下载大在线观看| 男人的天堂99| 人人潮人人摸| 天天操夜夜操| 东京热不卡视频| 国产精品97视频| 亚洲图片欧美| 久久性爱网站| 麻豆 欧美 日韩| 久久伊人青青草| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 操操AV电影| 韩国三级三级BD在线| 校园春色家庭伦理欧美激情| 一区二区影视| 中文字幕123| 99在线精品视频| 91久久久视| 插插综合网天天影视网| 国产日韩欧美中文在线播放 | 操死我了啊啊啊| 熟女人妻一区二区三区免费看| 99色网| 欧美少妇性乱| 免费看黄片现成| 色综合久| 久久人妻无码毛片A片麻豆| 91综合站| 看一级黄色视频| 日韩天堂av电影在线观看| yazhouzaixian| 欧美一级黄色免费专区| 五月天婷婷成人网| 十八禁黄色| 人妻一区视频| 久久中文色图| www.yeyecao| 大香蕉123| 精品综合久久久久久97| 国产精品亚洲天堂网址| 男人的天堂.com| 久久精品国产亚洲粉嫩| 中文字幕成人理论在线| 亚av顶级裸体一区二区三区四区五区| 牛牛操视频逼| 91丨精品丨国产丨丝袜| 18禁在线视频| av在线浏览| 超碰2017| 97免费在线视频在线观看| 97国产精选| 岛国在线一区二区三区| 新视频sss国产| 国产又黄又粗的视频| 九九九九九九九精品视频| 日韩无码三级影院| 大香蕉在线视频重口味毛片在线| 男女做爰猛烈动高潮A片免费应用| 色色无码| 国产精品日日摸夜夜添骚逼| 色综合98| 欧美gv在线观看| 图色综合网| 日韩无码视频黄色| 九九免费影片| 丁香五月电影| 碰碰97| 欧美v日韩欧亚洲电影天堂色诱,国产传媒| 91亚洲欧美激情| 97操操| 午夜毛片亚洲精品片国产久久久| 丰满人妻一区二区三区| 亚洲色婷婷久久久综合日本| 亚洲美女精品| 国产乱色国产精品免费视| 人妻在线大香蕉| 日韩国产不卡在线视频| 欧美第二页午夜| 强奸乱亚洲| 91亚洲情色| 亚洲 图片 欧美 色图| 日韩欧美大片免费高清啪啪| 久久久禁| 天美传媒av 在线| 69XX一中文字幕人妻91| 欧美 综合 亚洲| 六十路日本| 超碰在线一区二区三区| 青青久操| 色色五月丁香| 在线a v| 精品国产99999| 后X久久| 国产一区自拍欧美日韩| BBBBB97COM| 麻豆国产视频精品观看| 久污| 中文字幕乱碼在线| 色色色热| 久久‘黄片视频| 国产精品一区二区三区免费视频| 色麻豆AV| 欧亚综合一卡二卡中文字幕| 亚洲天堂人妻熟妇视频| 日本中文字幕不卡视频| 亚洲图片欧美另类综合免费视频大大香| 国产欧美日韩在线不卡第一页| 欧美性暴力| 天天操人人操骚逼网站| 中文字幕 人妻不满 在线视频| 最新岛国大片| 高潮精品| 午夜欧美精品久久久| 大香蕉在线免| 91在线欧色| 亚洲精品天堂久久A∨51成人漫| 亚洲双插| 午夜九九| 精品国产久久乱码| 狠狠干精品一二三四五六2022| 国产AV高清AV无码| 亚洲欧美综合区自拍另类| 91色花堂| 91欧美经典| 搡老熟女国产1000部| 亚洲精品 超碰| 色99在线| 激情久久久| 人妻系列无码专区中文有码| 97色插| 国产成人bd在线观看| jazzjazz国产精品麻豆| 东京热男人的天堂| 亚洲欧美日韩激情不卡| 欧美激情 一区| 97草草| 国产丸一视频| 亚洲成人帖图| 色婷婷一区二区三区久久午夜成人不| 亚洲在高跟鞋自慰久久在色线| 午夜天堂精品久久久久91| 久操视频资源站公开| 麻花豆传媒剧国产MV出差| 精品欧美老熟女一二区| 国产精品美女久久久久久网站| 大香蕉伊人75| 91亚洲网站| 高颜值美女口爆高潮浪叫| 国产天天噜一噜久久久| 中文字幕色AV| 天天躁日日躁狠狠狠躁| 麻豆av一区二区| 超碰97COm中文| 91少妇人妻| 亚洲色图欧洲| 一级性爱视频免费在线| 亚洲国产精品V?在线播放| 岛国黄片网站| 日日日日做夜夜夜夜无码| 亚洲**2021在线观看| 国产亚洲精品A在线观看下载| 中文字幕丰满人妻日本| 成人一道本免费视频| 国产第12页| 美女午夜福利免费视频| 午夜无码熟妇丰满人妻| 婷婷性网| 日韩性爱啪啪视频| www.91人妻.com| 亚洲成人日韩小说| 涩五月婷婷| 欧美人妻精品| 伊人991| 校园春色家庭伦理欧美激情| 国产区在线| 天久久久噜噜噜久久国产精品爽爽 | 国产操操日韩三级黄| 殴美在线AⅤ| 操人91| 久久一二区四| 成人精品欧洲亚洲| 2019天天干| 大香蕉www.超碰| 草莓精品视频| 国产精品久久9| 少妇色综合| 男人的天堂一区| 国产无码高清操逼视频| 五月色网| 亚州高清色综合| 91日韩网站| 日韩成人高清一区二区| 亚洲AV无码国产精品久久久久| 啊啊啊慢点| 综合一区中亚洲国产成人综合精品 | 久久风骚城市| 夜夜草天天| 亚洲乱码国产乱码精网站| 久超碰在| 台湾佬中文娱乐网久久久久久久久久com | 国产人伦a片信息免费片| 91丨九色丨东北熟女| 亚洲蜜臀懂色| 超碰在线一区二区| 国产呦精品一区二区三区下载| 日韩性色b| 日本免费一区二区不卡 | 久草在| 欲香欲色| 在线只有精品| 日韩有码回春沙龙第一页| 午夜男女爽爽爽影院视频| 亚洲日本韩国在线| 男女性扦B| 日本一区二区三区午夜观看| 台湾佬激情综合| 97精品一区| 亚洲字幕一区二区| 国产精品网站免费| 91丝袜在线观看| 久久色情| 日韩熟女精一区二区三区不卡| 强奸乱伦动态污图免费 | 影音先锋每日最新资源在线观看| 久久超碰爱| 午夜啊啊| 婷婷五月影院| 一本色道久久综合精品婷婷| 色色五月天婷婷| 蜜桃午夜视频一区二区| 综合欧美日韩在线观看| 亚洲91射| 国模精品娜娜一二三区| 欧美手机在线综合| 国产综合操逼高清| 我爱操| 美女的肌被草喷水视频| 黄色人人| 欧美日韩另类字幕中文| 玖玖爱免费观看视频| 亚欧美综合网。| 日韩欧美国产一区二区三区四区 | 久久久久国产精品喷潮免费观看臀| 九草在线大香蕉| 欧美区亚洲区偷拍区| 97大色网| 国产精品久久久久久无码红治院| 91AV天美在线视频| 探花精品视频| 91性色| 啊啊啊啊啊啊在线看| 啪啪视频免费在线观看| 亚洲宗合电影| 久久久久久国产无码精品| 伦在线97| 99色在线观看| 一起草三级AV电影在线观看| 亚洲欧洲久久天堂| 国模吧 一区二区三区| 91亚洲网站| 久久免费中文字幕在线观看| 日本高清视频xxxx| 亚洲欧美天| 日本精品一区三区| 精品久久久久久中文字幕三区| 亚洲高清少妇| 丁香五月影院| 激情熟女12P| 91N综合网在线| 99精品久久| 高潮精品| 亚洲国产一级中文综合久久天堂在线免费观看| 在线播放一级无码视频| 日韩大香蕉AV影片| 久日91在线| 99综合免费视频| 国产无马在线| 天天射天天色成人| 久操 高清| 91精品国产麻豆国产自产在| 久久黄片国产一区二区| 国语精品av| 熟女自慰久久久| 亚洲1区| 亚洲欧洲日韩天堂av| 欧美亚洲特P| 超碰人妻中文在线| 国产少妇与亚洲av| 综合一区中亚洲国产成人综合精品 | 家庭乱伦国产精品| 在线天堂资源亚洲| 熟妇高潮精品一区二区三区下载| 日韩精品一区二区三区四虎影视| 黄色一区二区秘书性感| 日本一区二区中文字幕久久| 香蕉国产97| 99xav| 水澄无码AV| 人妻精品视频一区二区| 成全在线观看免费观看| 日韩精品在线视频,日韩精品……| 呻吟 欧美 日本 中出| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 欧美另类精品xxxx| 欧美大香蕉久| 国产高清成人免费视频| 欧美姓爱综合网| 韩国毛片一区二区三区| 秋霞午夜视频一区二区| 丝袜喷水在线| 观看视频图片一区二区三区| 无码99| 精品免费成人久久| 国产和美国毛片| 成人五月天色网| 九九热超碰97亚洲最新香蕉| 人妻天天爽夜夜爽爽| 日本三级久| 99免费在线视频| av资源在线播放天堂| 日本一区二区做爱的视频| 精品国产一区二区三区香蕉欧美| 丰满美女一级毛片在线播放| 韩日色费| 日本狂喷奶水在线播放212| 激情小说图片亚洲首页| 伊人网免费视频| 国产成人超碰在线| 国产精品麻豆免费视频| 韩国一级婬片A片无码天美 | 97超碰免费人人性爱| 99热导航| 九区国产| 欧美淫乱视频| 美女啊啊啊啊啊| 色吧91| 人妻精品视频一区二区三区| 日本精品中文字幕视频| 伊人久久在线视频观看| www国产天美久久久| 懂色AV蜜臀无码精品APP| 无码日韩网站| 天天插天天插| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 久久精品28| 国产9区| 国产精品一二三区18| 中文字幕日韩电影人妻| 91成人久久| 99视频只有精品| 超碰97 线线 在现| 国产偷拍网站| 国产人妖视频一区在线观看| 色综合久| 精品人妻二区三区| 97国产伦理| 日本幼女18+| 国产精品白领在线观看| 亚洲国产高清福利视频| 97舔舔| 吉川爱美亚洲二区在线| 婷婷激情丁香| 狠狠操狠狠操操| 日本成人A片免费看| 亚洲欧美国产日本一区二区三区| 亚洲美乱| 久久AV色| av三级电影在线播放| 思思热久久成人| 日日夜夜狠狠| 亚洲日韩欧美一区二区| 麻豆成人影音在线| 日本女优在线视频福利| 少妇国产不卡| 亚洲 欧美 日本 国内 首页| 13小男生GAY自慰脱裤子| 日韩欧美一级特黄大片| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 十八禁的黄污污免费网站| 色婷婷激情| 麻豆 亚洲 97| 一区二区三区国产在线播放| 日本网色| 亚洲污污网站| 欧美黄色手机在线观看| 能看的AV| 91色射| 一级黄色视频网| ,国产乱人伦精品一区二区三区| 日韩有码回春沙龙第一页| 中文字幕天堂在线| 无码二级三级| 黄色AAAAA欧美| 久久久久久久久久久久久久久乱码 | 97超碰人人操人人操| 亚洲午夜AV| 天天操天天日青青草超碰av| 蜜乳视频网站| 四虎影视在线| 久久久精品网站| av一区二区三区 中文| 日韩图区| 又大又长又粗又爽又黄| 久久夜色一区二区| 搡老女人911熟妇老熟女| 丁香六月综合激情| 综合自拍| 在线视频日韩欧美国产| 久久久久人| 婷婷影院入口| 久久视频,这里只有精品 | juliaann精品熟女一区| 欧美天天性| 91粉芽高清在线一区二区| 色婷婷日韩精品一区二区三区| 黄片com.| 亚州欧美综合| 操逼操操操91| 欧美后入式| 丁香五月天激情网站| 国产熟码AV| 国产激情视频在线观看| 欧美性色欧美| 黄色AV影视| 久久春色| 一区二区三区四区五区高清无码永久视频 | 友优传媒精品在线一区二区| 嗯嗯啊中文字幕| 夜夜嗨视频| 成人精品视频一区二区| 三级AV入口| 久久美国毛片| 嗯嗯啊啊的视频| 日本中文字幕在线电影| 成人小电影网站tex| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 色综合99| 激情五月天中文字幕色| 躁躁日曰躁2020| 国产精品久久99日日| 亚洲午夜蜜臀| 91neishe| 操逼免费视频无码国产| 午夜福利合集| 国产超碰国产97| 乱伦一区二区三区‘| 热热色国产一二区AV| 91狠狠综合久久久久久| www.亚洲成人一区| 亚洲色综网| 久久久久久久一级黄色打同平台| 少妇一级无码精品| 日本不卡一区二区三区| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 亚洲图片偷拍欧美| 色97| 欧美日韩香蕉| 国产一级高清免费观看| 嗯,啊。舔我逼| 五月婷婷六月丁香| 嗯啊抽插大香蕉网页| 欧美日韩色| 99在线视频播放| 超碰国产在线| 国产自产自拍| 大学生美女口爆| 国产欧美日产一区二区三区 - 国产欧美日| chaopen97久久| 国产精品女同| 色婷网| 九九精品99| 97欧美综合| 日本久久999| 熟妇最新先锋一二三区| 男男H黄动漫啪啪无遮挡网站| 99无码狠狠久久| 亚洲玖玖爱| 青青草日本中文字幕 | 亚州男人天堂| 九九亚洲色在线观看| 天天日日本| 丁香五月AV| 久久国内| 神马久久久久久伦理片| 国产1024在线播放| 97超碰大| 久超碰这里只有精品| 国精综合一二三区影视| 欧洲天天在线| 人人操AV| www激情| 一区二区三区视频在线观看免费| 俄罗斯一区二区视频在线观看| 清纯唯美亚洲综合| 大茄子熟女AV导航| 国产AV天美传媒一区二区三区 | 人澡逼| 夜夜嗨绯色| 亚洲成人精品久久久| 国产四虎在线| 99热99re超碰精品| 国产欧美日韩在线观看麻豆传媒公司| 国产成人无码网站在线视频| 国产色精品午夜大片| 伊人久久大香线蕉无码| 欧美国产欧美在线观看| 少妇3P性爱自拍| 亚洲成人av电影在线| 亚洲精品尤物yw在线影院| 中文字幕日韩电影人妻| 久久精品国产AV一区二区三区| 亚洲黄片免费在线播放| 欧美人与动性人交a| 少妇 综合| 这里只有精品视频在线| 超碰99在线观看| 五月丁香啪啪啪| 色播五月丁香| 久久精品欧美一区蜜桃| 国产欧美伊人| 亚洲综合影视| 人妻黑丝袜电影| 人人妻天天做天天爽| 蜜桃网熟妇| 亚洲色图A| 精品视频在线观看精品| 日韩无码精品综合久久| 亚洲精品无码成人久久久99| 日本www操操操| 欧美视频在线视频免费va| 色婷婷六月| 青青草在线视频人人想人人上 | 免费啪啪av| 亚洲欧美在线观看免费| 色色色999| 玖玖97综合| 欧美乱妇狂野欧美在线视频| 亚洲AV色图一区| 天啪| 久久男人精品| 午夜精品视频777| 亚洲熟妇丝袜在线观看| 1000午夜黄色| 美女啊啊啊啊啊啊| 曰韩精品视频一区二区| 91精品久久综合熟女| 中文高清一区二区的| 亚洲精品 超碰| 一二三卡欧美日韩人妻免费精品| 色香综合| 一类av片在线看| 大香蕉丝袜一级片| 色综合加勒比四四季| 中文字幕伊人| 熟女探花啪啪| 国产女人成人精品视频| 熟妇亚洲一区二区三区| 91AV国产精品| 欧美日韩在线视频网站| 日韩一级欧美一级在线观看| 91人人爽人人爽| 高清孕妇孕交 交孕妇| 一区二区三区国产在线播放 | 97久久免费| 日本色色色| 91艹逼精品| 综合第一页| 久久久久久国产精品免费网站| 看日韩美女二区三区免费操逼视频| 殴洲老熟女| 男人午夜天堂| 婷婷五月天激情四射| 屌妞视频久久久久久久| 男人天堂网址| 91久久久久久| 欧美日韩97在线| 亚洲av无码成电影在线播放| 中文字幕在线观看视频www| 1000午夜黄色| 欧美成人A√在线一区二区| 天天干天天拍| 久久九九精品一区二区| 久久久久人妻二区精品叶可怜| 亚洲色五月| 亚洲中文字幕久久无码精品| 91丨豆花丨熟女| 亚洲精品欧美专业| 欧美天天性| 丁香五月激情综合| 啊啊啊男女| 国模无码一区二区三区在线| 韩国女主播青草在线| 天美传媒精品一区二区| 五月激情天| 东京热,男人的天堂| 婷婷深爱五月| 97国产精品在线观看| 乱伦系列一区二区| 欧洲亚洲综合| 久久毛卡| 天天影视之亚洲综合网| 亚洲一欧洲中文字幕在线| 天天舔天天日天天射| 国产精品无码久久久久2025| 青青草国产盗摄一二三区| 人人玩人人添人人澡免费| av午夜玫瑰| 国产在线观看91精品一区| 男人下部插入女人下部| a片自拍直播视频| 色女网日韩| 国产成年女黄特黄| 96AV久久久| 偷拍三区| 精品国产乱码久久久兰草影视| 一线黄色免费性爱片| 狠操91,com| 久久久久国产精品片区无码直播 | 婷色五月| 精品午夜福利| 少妇久久久久久| 中文字幕日产av人| 成人av影院在线观看| 亚洲视频二区 | 久操av在线| 激情五月丁香五月| 蜜臀在线视频| 欧美一二在线| 国产福利av精彩对白| 欧美激情 亚洲色图| 欧美性特| 青青免费在线视频一区| 91色堂| 在线99热| 热99这里有精品综合久久| 久久久久久91香蕉国产| 国产亚州精品美女久久久免费| 91插B网站| 亚洲中文制服诱惑| 国产福利在线视频网站| 玖玖爱视频网站| 97精品国产97久久久久久户外免费| 国产家庭乱伦表演| 97久久精品不卡| 国产欧美伊人| 密乳无码| 热99re69精品8在线播放| 亚洲日韩青青草色月| 日本三级R| 久久国产成人精品国产成人亚洲| 青青草成人视频在线观看二区 | 午夜精品久久久久久久久久久久久| 欧美亚男人的天堂| 亚洲蜜桃V妇女| 91天天| 搡老女人老91妇女熟女| 野狼激情网| 激情综合网五月婷婷五月天| 国产精品久久久久久久久久久久| 日韩久久艹| 国产一区二区三区中文字幕| 国产91乱伦| 91无码西班牙视频在线| 少妇特黄一区二区三区| 亚洲日本男人天堂网| 黄色高清无码无码破解免费暗网 | 极品粉嫩一区二区| 欧美一区二区亚洲天堂| 国产色综合亚洲色综合吹潮| 日逼97| 爱妻综合网| 久久国产对白激情浪潮| 国产刺激视频| 第一高清av中文字幕| 人人操人人操人人人操| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 久久人妻97久久久久久久| 亚洲一区日韩| 人人操人人搞人人草| A级在线视频| 99re视频在线播放青草| 欧美日韩97在线| 自拍视频大全亚洲专媒视频/一区二区三区| JULIA一区二区三区在线播放| 在线无码视频| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 中文熟女五十乱码在线| 美腿丝袜高跟网免费视频免费视频| 天天日天天插| av大香蕉| 亚洲色欲天天人妻无码系列专区| 大香网站| 亚洲色色探花| 琪琪精品免费一区二区三区| 免费精品国偷自产在线在线| 97超碰中文在线| 色与欲影视| 蜜臀久久99精品久久久久久成人小说 | 国产精品爆乳懂色蜜乳| 亚洲加勒比| 97久久国产| 久操免费观看| 人人澡人人干| 大香蕉狠狠爱| 偷拍盗拍亚洲色图图片| 久久精品超碰| 精品日日人妻| 久午视频| 天天综合网~91| 亚洲欧美首页| 黄片www视频免费| 人妻一区二区三区四区视频| 97啪啪| 国产精品第一区第一页| 欧美区亚洲区偷拍区| 青草草免费网站av| 国产亚洲女v在线观看| 十八禁的黄污污免费网站| 一牛影视成人片免费| 欧美系列在线一区二区| 黄色片大香蕉| 99成人| 久草精品热视| 玖玖爱一区在线| 久久精品视| 99日视频在线免费| 久草视频分类在线| 婷婷久草| 热天堂一区二区| 麻豆 亚洲 97| 毛片99-全集电影手机免费观看完整-B029AV| 国模91| juliaann欧美丝袜办公室| 精品视频在线观看| 免费一级精品啪啪视频| 最近2019中文字幕国语免费版| 免费看久久久性性| 久久久久无码| 九九九九九九九九九九精品视频| 综合色久欲| 亚洲全色网| 欧美日韩黄片精品在线| 久久亚洲精品成人av| 人妻激情另类| 国产一区二区三区,在线观看观看| 久久精品综合| 国产熟女精品一区二区| 特级毛片特黄久久免费看| 国产成人+综合亚洲+天堂| 免费看污网站| 国产精品毛片| 日韩兔费看黄片| 秋霞无码av鲁丝片一区| 伊人久久88国产女| 日韩美女,国产传媒,视频一区| 国产夫妻性生活视频| 一区二区三区国产在线播放 | 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 清纯唯美亚洲综合| 欧美偷拍区| 99热官网| 性交一区二区在线播放| 射久久| 国产午夜激片Av毛片不卡| 东京太热久久久| 欧美黑人日韩少妇色情| 天天看夜夜看日日干| 日亚韩精品视频二区三| 嗯嗯嗯不要不要免费视频| 久超碰这里只有精品| 亚洲春色欧美激情自拍| 99色色| 人妻人久久精品中文字幕| 精品国产av一区二区三区四区入口| 日本日皮视频逼| 中国黑人三级片网站上区| 酒色综合网| JULIA一区二区三区在线播放| 蜜桃不卡一区二区| 欧美色图色综合| 日韩九区| 精品成人女人久久| PMv在线观看| 国产伦精品一区二区三区视频女| 久久久久921| 伊人久久综合影院精品久久久| 爽爽淫人网| 欧美少妇高潮视频| 久久精品国产亚洲AV片多多| 超碰1024久久| 欧美v日韩v亚洲v最新在线| 99熟女| av网页一区二区三区| 中文在线久久字幕| 肏逼视频日本| 国产精品乱人伊人网| 欧美黄业| 亚洲日本成人动漫| 日韩本不卡视频在线观看| 五月丁香社区婷婷日韩欧美精品影院 | 亚洲图片欧美偷拍| 91精品国产高清久久久久久,亚洲成人 | 美女网站黄页| 亚洲欧洲精品视频发布| 亚洲在高跟鞋自慰久久在色线| 欧美不卡五十路| 91九久| 91久久久亚洲| 国产suv精品一区二区四区999| 国产91 丝袜在线播放00-百度| 欧美日韩91| 99热销国产这里有精品| 色欲天天综合网| 国产精品白丝www| 五月天开心网| 欧美少妇色图| 人妻美腿丝袜制服诱惑综合天堂-| 天天色图| 成人色女网| 亚洲国产ⅴ高清在线观看| 人妻少妇精品久久久| 国产AV久久野战精品| 久欲AV| 99欧美| 国产精品人妻免费精品| 日韩精品人妻系列无码天堂| 欧美成人A√在线一区二区| 啊啊啊在线观看免费视频| 国产成年精品高清在线观看91| 日本新免费二区三区| 亚洲综合一| 91成人久久| 97中文字幕一区| 激情自拍 校园春色| 97国产超碰| AV天堂男人的天堂| 26uuu国产日韩综合在线观看| 欧美体内射精| 久久人妻办公室视频| 一起草三级AV电影在线观看| 女人一区| 91天堂色男人的天堂| 91综合网在线| 91天美传媒精品| 人人摸人人干人人拍97| 亚洲女人91| 97香蕉人人乳| 一区二区三区视频在线观看免费| 天天综合网在线91| 亚洲欧美天堂在线| av日韩在线观看电影| 亚洲高清91| 97日视频| 五月丁香婷婷色| 日本高清免费一本视频在线观看| 小骚逼被操的爽不爽| 91黑丝在线播放| 日本成人A片网站| 国产精品视频一区二区三区八戒| 欧美se综合| 超碰人妻中文在线| 五月婷婷深深爱| 欧美综合娱乐久久| 午夜精品久久久久久久久久久久久| 色五月天AV| 婷婷99狠狠躁天天躁| 在线欧美69V免费观看视频| 成人三级片一区二区三区视频| 久草婷婷| 另类图片五月天| 中国女人内射6XXXXX| 天天看夜夜看日日干| www.成人无码| 啊啊啊不要啊啊受不了了视频在线 | 精品国产精品一区二区| AV麻豆免费一区| 东京太热男人的天堂久久久| 日本最新免费韩国1区2区视频播放| 五月婷在线| 殴美大黄片| 久草视频观看视频在线| 青青色在线观看| 亚洲欧美综合网| 精品人妻伦一区二区三区久久| 麻豆区99999| 中文字幕 人妻不满 在线视频| 大香蕉久| 日韩美女啪啪一区| 欧美巨大性舒爽顶到了| 日韩大香蕉AV影片| 伊人在线大香蕉视频久久| 啊啊啊啊啊啊好湿好爽视频| 中文字幕五区| 婷婷五月天AV| 中文字幕日本久久| 日韩欧美中文日韩欧美色| 操逼日批| 天天上日日上日韩精品| 天天综合网在线观看| 精人妻一区二区三区| 亚洲91射| 高清孕妇孕交 交孕妇| 91激情综合| 日日干男人的天堂| 97公开久久| 97色色,97综合| 中文字幕人妻色偷偷久久皮| 78p欧美| 欧美天天谢综合网| 国产视频三区四区| 久久久com| 性感女人网页在线观看视频| 丰满人妻一区二区三区| 99色热| 五月婷婷六月丁香| 999在线电影香蕉| 久久久精品国产亚洲伊人| 碰碰在线视频| 后入 亚洲 美女 射| 大香蕉十区| 青娱乐蜜桃臀AV色婷| 日本东京热大香蕉a片| 加勒比海成人视频网| AV丝袜东京热| 后入福利视频| 啊啊啊好大好深| 免费观看一区| 色屁屁影院www国产| 思思热久久成人|