在VBA中如何使用動態數組,以及利用動態數組去除重複值的方法

2021-01-10 VBA語言專家

大家好,我們今日繼續講解VBA數組與字典解決方案第22講:在VBA中如何使用動態數組,以及利用動態數組去除重複值的方法。如果文本中含有大量的重複值,此時,如果我們要剔除重複值,該怎麼辦?用VBA的方法該如何做到呢?我在這講和下一講中將解答這個問題,並提供給讀者一個可以測試的實例。今日先講這個內容要用到的知識點。

一 :Filter函數:這個函數返回一個下標從零開始的數組,該數組包含基於指定篩選條件的一個字符串數組的子集,語法如下:Filter(sourcesrray, match[, include[, compare]])

參數

a) sourcesrray是必須的,要執行搜索的一維字符串數組。

b) match是必須的,要搜索的字符串。

c) include是可選的,Boolean值,表示返回子串是否包含match字符串。如果參數include是True,Filter函數返回的是包含match參數子字符串的數組子集。如果參數include是False,Filter函數返回的是不包含match參數子字符串的數組子集。

d) compare是可選的,所使用的字符串比較類型。

二:ReDim語句,這個語句在過程級別中使用,用於為動態數組變量重新分配存儲空間,語法如下:

ReDim [Preserve] varname(subscripts) [As type] [, varname(subscripts) [As type]]

參數

a) Preserve是可選的,關鍵字,當改變原有數組最末維的大小時,使用此關鍵字可以保持數組中原來的數據。

b) varname是必須的,變量的名稱。

c) subscripts是必須的,數組變量的維數,最多可以定義 60 維的多維數組,使用下面的語法;[lower To] upper [,[lower To] upper]

使用動態數組去除文本中的重複值,如下面的代碼所示。

Sub MyNZsz_5() '第22講 利用數組排重的方法

Dim Splarr() As String

Dim Arr() As String

Dim Temp() As String

Dim r As Integer

Dim i As Integer

On Error Resume Next

Splarr = Split(Sheets("22").Range("a1"), " ")

For i = 0 To UBound(Splarr)

Temp = Filter(Arr, Splarr(i))

If UBound(Temp) < 0 Then

r = r + 1

ReDim Preserve Arr(1 To r)

Arr(r) = Splarr(i)

End If

Next

Sheets("22").Range("a5").Resize(r, 1) = Application.Transpose(Arr)

End Sub

代碼解析:

MySplitarr過程將工作表Sheets("22")中A1單元格的文本去除重複值後寫入到工作表Sheets("22")中的A列單元格。

第2行代碼聲明數組Splarr用來保存Sheets("22")中A1單元格的文本。

第3行代碼聲明數組Arr用來保存去除重複值後的文本。

第4行代碼聲明數組Temp用來判斷文本是否重複。

第5行代碼聲明變量r用來保存去除重複值後的文本數量。

第7行代碼啟動錯誤處理程序來忽略錯誤,因為在程序運行到第11行代碼會發生下標越界錯誤。

第8行代碼使用Split 函數以Sheets("22")中A1單元格的文本創建一個下標從零開始的一維數組。

第9行代碼使用For...Next語句遍歷數組Splarr的所有元素。

第10行代碼使用Filter函數創建一個數組Temp用來保存以當前Splarr數組的值在Arr數組中的搜索結果。

第11行代碼根據返回的數組Temp的最大下標來判斷當前Splarr數組的值是否重複。在使用使用Filter函數時如果沒有相匹配的值,將返回一個空數組,最大下標小於0。如果沒有找到,返回的結果是-1.

第12行代碼如果當前Splarr數組的值不重複則將變量r的值加1。

第13行代碼重新定義動態數組大小。

第14行代碼將不重複值添加到數組Arr中。

第15行代碼使用工作表Transpose函數將去除重複值的的文本轉置後寫入到工作表單元格中。

代碼的截圖:

運行前的截圖:很顯然有很多的重複數值:

運行後的截圖:

今日內容回向:

1 上述代碼是否清楚了它的運行過程呢?

2 第7行代碼啟動錯誤處理程序來忽略錯誤,這是為什麼呢?

相關焦點

  • Filter函數和ReDim語句講解,以及VBA中利用動態數組排重的方法一
    大家好,我們今日繼續講解VBA代碼解決方案的第61講內容:在VBA中如何使用動態數組,以及利用動態數組去除重複值的方法。在上一講中我們講了使用數組函數將單元格中的文本進行分隔後寫入到工作表中的方法,那麼問題來了,如果文本中含有大量的重複值,在寫入時也會將重複值寫入到工作表中,此時,如果我們要剔除重複值,該怎麼辦?用VBA的方法該如何做到呢?我在這講和下一講中將解答這個問題,並提供給讀者一個可以測試的實例。今日先講這個內容要用到的知識點。
  • VBA中動態數組的創建及利用
    在今後更加嚴峻的存量殘殺世界中,為自己的生存進行知識的儲備,特別是新知識的儲備。為後疫情時代做的必要準備。今日繼續和大家分享VBA編程中常用的常用「積木」過程代碼。這些內容大多是我的經驗的記錄,來源於我多年的經驗。
  • C語言編程技巧:以實例跟我學動態數組的創建及使用方法
    在C語言中提供了諸如內存的申請、釋放等管理函數,然後結合指針可以按需動態地分配內存空間,來構建動態數組,達到有效利用計算機內存資源的手段。基本函數說明C語言中用於動態數組操作的函數主要包括malloc、calloc、realloc和free等,每個函數的原型、參數意義及功能說明如下表所示:下面通過一個例子演示動態數組的創建及使用方法。
  • 在Delphi XE7下如何建立動態數組呢?
    在Delphi XE7中Object Pascal有了一個很有意義的新功能,Object Pascal提供了初始化動態數組,並改進了它的工作與操作模式。那麼新的Delphi XE7中, Object Pascal語言可以讓我們做那些新的業務呢?大致來說有以下幾點:1.
  • Excel VBA如何定義數組,這裡有最全的數組定義方法
    No.1VBA中的數組定義和賦值,是編程進階的一個標誌。無論什麼編程語文,數組的應用是一個十分重要的項目。如何玩到熟練,就各有各的玩法。但是基礎的東西,一定要掌握牢固。這樣才在應用的過程中,不會迷茫。No.2首先看一下上面的圖片,是為對數組定義的一個集合。
  • Python語言中使用array模塊實現動態數組的操作
    背景對於動態數組諸如創建、插入、刪除、查詢大小等操作,在C/C++語言中,可以使用標準庫中的vector類實現,而在python語言中,也同樣提供了內置的array模塊實現類似的功能。動態數組的創建創建方式為:array.array(typecode[, initializer]),第1個參數typecode定義了數組元素的類型,第2個可選參數給出了數組中的初始值。如下面的代碼創建了一個int型的包含3個元素的數組x,其初始值為分別為1、2、3。其索引方式同列表類似,下標從0開始,如x[1]代表取數組x中的第2個元素。
  • Excel VBA 數組基礎知識,初學者不可不學的關鍵知識
    今天和大家要說的是VBA數組的基本知識點,等你學到後面就會知道,數組和字典搭配起來真的是事半功倍的啦!所以學習好數組的基本知識點也是必不可少的,基礎知識有了,才能有後面的應用。數組的基本概念數組其實是一組擁有相同元素的的組合。我們可以使用數組名稱和他在數組中的位置來指定某些特定的值。可以擁有很多的值,他們在數組內部是通過引索號進行區分的。
  • 如何將Excel數據表單元格保存為數組,VBA數組進階應用
    No.1在vba編程中,數組應用是一個十分有用的方法。如何把數據表作為數組進行處理,是編程過程中的一個重要技能。學會之後,將大大提高編程技術,也將使數據處理的過程變得更加流暢。No.2上圖為例,把表格內容作為數組值進行保存,然後通過流程編碼對成績進行一個比較判斷,最終得出一個成績等級的判定。
  • 基於一維數組動態處理矩陣運算
    [代碼]基於一維數組動態處理矩陣運算     跳至 [1] [全屏預覽]
  • 如何使用Numpy數組?
    【連續「Python利用Numpy數組進行數據處理(一)」】2.【聚合函數】數學和統計方法[軸和0]可以通過數組上的一組數學函數對整個數組或某個軸向的數組進行統計計算。[any/all]在上面這些方法中,布爾值會被強制轉換為1(True)和0(False)。
  • 了解什麼是數組,如何應用數組,只需1分鐘就可以秒變數組大神!
    第一個公式={Sum(2*4,3*2)} =Sum(8,6)=14第二個公式={Sum(2+4,3+2,) }=Sum(6,5)=11看了這些,你應該可以稍微理解了什麼是數組了,數組是怎麼運算的。接下我們順便說下什麼是常數數組,這個在後面會用到,也是一個非常重要的概念。我們可以在數組中使用常數值,這些值可以放在數組公式中使用區域引用的地方。
  • PHP函數in_array()如何檢查數組中的值
    PHP函數in_array()如何檢查數組中的值 PHP函數in_array()可以幫助我們輕鬆的完成對數組中某個值的檢查。我們下面就舉一個例子來幫助大家理解PHP函數in_array()的具體應用。
  • 怎麼理解php中的數組?php的數組創建和使用方法是什麼?
    php數組的定義數組就是值類型相同的變量的集合,在PHP中的一種常用的複合數據類型,數據可以存放很多的數據,可以存儲任何類型的數據。我們可以把變量當做一個包含值得盒子,那麼可以把數組當做當成一個帶有隔層的盒子,每一層都可以存放一個值。
  • Java基礎篇——數組詳解
    項目開發中,如果需要存儲大量的數據,例如如果需要讀取100個數,那麼就需要定義100個變量,顯然重複寫100次代碼,是沒有太大意義的。Java語言提供了數組(array)的數據結構,可以解決這個問題。數組的概念一個數組是相同數據類型的元素按一定順序排列的集合。
  • VBA數組數據回填工作表
    第三節 VBA數組數據回填工作表在前兩節我們講了如何將工作表中的數據讀到數組中,這種操作的實質其實是:將數據預存到內存中,然後在內存中調取數據再進行下一步操作,這樣可以節約反覆提取數據的時間。當我們在內存中將數據計算完成後,需要將結果數組回填給工作表,又要注意哪些問題呢?對於工作表而言,可以回填的是數組可以是一維或二維的。
  • Python使用ctypes模塊調用DLL函數之C語言數組與numpy數組傳遞
    在Python語言中,可以使用ctypes模塊調用其它如C++語言編寫的動態連結庫DLL文件中的函數,在提高軟體運行效率的同時,也可以充分利用目前市面上各種第三方的DLL庫函數,以擴充Python軟體的功能及應用領域,減少重複編寫代碼、重複造輪子的工作量,這也充分體現了Python語言作為一種膠水語言所特有的優勢
  • 動態規劃:關於01背包問題,你該了解這些!(滾動數組)
    昨天動態規劃:關於01背包問題,你該了解這些!中是用二維dp數組來講解01背包。今天我們就來說一說滾動數組,其實在前面的題目中我們已經用到過滾動數組了,就是把二維dp降為一維dp,一些錄友當時還表示比較困惑。
  • VBA數組函數、差值的取得以及利用FileCopy語句複製文件
    NO.176-NO.177容是:NO. 180:在VBA中split和join對數組操作NO. 181:在VBA中查找數組的差集NO. 182:在VBA中使用FileCopy語句複製文件VBA過程代碼180:在VBA中split和join對數組操作 Sub mynz()Dim arr, myst As String
  • Python使用ctypes模塊調用DLL函數之複數數組的參數傳遞
    這兒就涉及到了如何將C語言中的複數數組(Complex array)類型與Python中的數據類型進行交互的問題。在Python語言中,可以使用ctypes模塊調用其它如C++語言編寫的動態連結庫DLL文件中的函數,前面多篇文章中已經講了傳遞數值/指針/字符串參數、傳遞結構體參數、傳遞普通數組類型的例子,大家可以回看一下,這樣可以更好的理解本次要講的內容。
  • VBA數組與字典解決方案第32講:數組的拆分和維數轉換
    如果數組有多行和多列,但只使用 row_num 或 column_num,函數 INDEX 返回數組中的整行或整列,且返回值也為數組。③ Row_num 數組中某行的行序號,函數從該行返回數值。如果省略 row_num,則必須有Column_num。④ Column_num 數組中某列的列序號,函數從該列返回數值。