VBA 自定義排序學習記錄

2022-07-07 18:18:17 字數 1532 閱讀 8736

一直想學下自定義排序,之前有了解到sort方法排序和乙個個對比的排序方法,今天遇到個需要按固定順序來排序的問題,所以一時興起就去網上找了下答案。

排序後結果

**片段:

sub order_by_customize()

dim ws as worksheet

dim arr(), brr()

dim d as object

dim r(), i&, j&, k&, ra as range

set ws = activeworkbook.worksheets("排序測試")

set d = createobject("scripting.dictionary")

j = ws.cells(1, columns.count).end(xltoleft).column

i = ws.cells(rows.count, "b").end(xlup).row

'將目標自定義排序列資料寫入陣列,這裡我把指定序列 先放到b列下面空白的地方了

r() = ws.range("b21:b" & i).value

k = 1

'自定義排序的陣列寫入字典,序號作為item

for k = 1 to ubound(r())

d(r(k, 1)) = k

next

i = ws.cells(rows.count, 1).end(xlup).row

'資料來源寫入陣列

arr() = ws.range(ws.cells(2, 1), ws.cells(i, j)).value

'建立另乙個陣列,用來記錄排序的序列號

redim brr(1 to ubound(arr()), 1 to 1)

k = 1

for k = 1 to ubound(arr())

'將自定義排序的序號寫入陣列brr, 我想要排序的被排序的列在第1列

if d.exists(arr(k, 1)) then

brr(k, 1) = d(arr(k, 1))

else

brr(k, 1) = "指定序列不存在"

end if

next k

'將新的序號放在最後一列

ws.cells(2, j + 1).resize(ubound(brr()), 1) = brr

set ra = ws.range(ws.cells(1, 1), ws.cells(i, j + 1))

'sort方法排序

ra.sort key1:=ws.cells(2, j + 1), order1:=xlascending, header:=xlyes

'刪除輔助排序的列

ws.range(ws.cells(1, j + 1), ws.cells(i, j + 1)).delete

set d = nothing

end sub

學習參考的網頁:

他山之石 VBA自定義函式

vba自定義函式自己是最近才開始使用的。其好處是可在工作表中直接呼叫,很方便。這裡,這位老師總結的很好,學習了!1 什麼是自定義函式?在vba中有vba函式,我們還可以呼叫工作表函式,我們能不能自已編寫函式呢?可以,這就是本集所講的自定義函式 2 怎麼編寫自定義函式?我們可以按下面的結構編寫自定義函...

VBA使用者自定義函式

函式是一組可重複使用的 可以在程式中的任何地方呼叫。這消除了一遍又一遍地編寫相同的 的需要。這使程式設計師能夠將乙個大程式劃分成許多小的可管理的功能模組。除了內建函式外,vba還允許編寫使用者定義的函式。乙個vba函式可以有乙個可選的return語句。如果要從函式返回值,則可使用return語句。例...

VBA自定義函式 Minkowski距離

接觸vba第一天,寫了個閔可夫斯基距離 當r 1時,距離為曼哈頓距離 當r 2時,距離為歐幾里得距離距離 直線距離 當r 時,距離為切比雪夫距離 根據閔可夫斯基距離距離公式,在vba寫出以下 public function distance a as range,b as range,optiona...