Excel 總有些簡單而強大讓你相見恨晚的功能,如果沒人告訴你,這輩子也許. ... 在自訂格式代碼中是自動填滿它很熱情儲存格有多寬,它就填多滿它很克制絕對不會溢出截止 ... ... <看更多>
「excel儲存格位置加減」的推薦目錄:
- 關於excel儲存格位置加減 在 [算表] VBA範圍無法重算- 看板Office 的評價
- 關於excel儲存格位置加減 在 Excel 效率王 的評價
- 關於excel儲存格位置加減 在 Excel 函數教學#01 | Match 函數| 搜尋儲存格範圍中的指定項目 的評價
- 關於excel儲存格位置加減 在 君邑資訊林士傑FB/Youtube: 燕秋老師教學頻道Line 的評價
- 關於excel儲存格位置加減 在 分享Excel必學的查表公式_Match+Offset - App板 - Dcard 的評價
- 關於excel儲存格位置加減 在 Excel 樞紐分析表結果之公式運算問題 - Mobile01 的評價
excel儲存格位置加減 在 Excel 函數教學#01 | Match 函數| 搜尋儲存格範圍中的指定項目 的推薦與評價
... 函數會搜尋 儲存格 範圍中的指定項目,並傳回該項目於該範圍中的相對 位置 。 lookup_value 引數可以是一值(數字、文字或邏輯值)... ... <看更多>
excel儲存格位置加減 在 君邑資訊林士傑FB/Youtube: 燕秋老師教學頻道Line 的推薦與評價
儲存格 內容若為公式,首字元必須以等號開始(=),輸入公式之後,Excel會自動運算,結果呈現在 ... 公式內特定儲存格位置,永遠參照到一個特定儲存格資料,保持不變。 ... <看更多>
excel儲存格位置加減 在 分享Excel必學的查表公式_Match+Offset - App板 - Dcard 的推薦與評價
Excel 必學的查表公式_Match+Offset > [color=#40f1ef][name=LHB阿好伯, ... 相同都是利用Match先將所需資料的儲存格位置找出來再回傳儲存格內容 ... ... <看更多>
excel儲存格位置加減 在 Excel 樞紐分析表結果之公式運算問題 - Mobile01 的推薦與評價
小弟有一個問題是: 後面連結到有樞紐分析表的儲存格公式都不能直接下拉或 ... 直接在設定公式的儲存格裡面輸入計算的儲存格位置,不要用滑鼠去點樞紐 ... ... <看更多>
excel儲存格位置加減 在 [算表] VBA範圍無法重算- 看板Office 的推薦與評價
Function abc(X As Range)
Dim XR As Integer, XC As Integer
XR = X.Row
XC = X.Column
abc = Application.Average(Range(Cells(XR - 2, XC), Cells(XR, XC)))
我發現他不會自動重算!
在活頁F10輸入abc(E10) 他會計算E8:E10的平均
可是更動E8或E9的數值 他不會自動重算!
只有更改E10 或F10重新輸入 才會自動重算
即使按 立即重算 也不會重算
修改資料 但公式不會重算……
在這簡單案例中 我知道直接拉公式比較快
但我的資料計算很複雜 公式會打一堆 一更動就很難維護
要怎麼做比較好呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.239.149.248 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Office/M.1618317619.A.BC2.html
如果這個公式用太多,可能會很慢?
限定範圍是在公式寫 if 範圍內有變動 就重算 嗎?這個程式碼應該怎麼寫呢?
另一種方法,我已經把excel公式拆成兩格,那就寫兩個自訂公式,公式搬進VBA就好
至少維護不用擔心公式跑掉,也會自動重算
Function bcd(X As Range)
XR = X.Row
XC = X.Column
y1 = X * 2
y2 = X * 3
bcd = y1
Cells(XR, XC + 2) = y2
是否無法這樣寫,只能sub然後
Set X = Application.InputBox(prompt:="輸入X的儲存格", Type:=8)
用sub似乎就沒那麼多問題,可是好像只能一個一個做,大量資料就要用陣列?
如果要保留3個range,是否要用陣列?
因為我的資料滿複雜的,而且格式也還沒確定,自訂函數好處是很好挪,用VBA寫要先規
劃好?我的陣列跟迴圈要想很久,之前寫兩三個都是卡很久才成功運作@@
我公式的x要輸入4個,x1 x2 x3 x4,輸出的y可以有5種,5種y的算式大多相同,少部份
是正負號相反,乘法變除法。之前寫自訂函數,真的就拆成5個公式,y1公式y2公式...
現在是用一個公式,然後多一個x5,x5輸入y1y2...得到對應的y。
有時候5種y都要用到,等於很多運算都是重複的,這就應該寫成sub?寫到一半發現我只
是只是把function從活頁搬進sub而已...計算還是一樣大量重複,如果把原公式輸入進
去,程式碼就會變得很多行,看起來怪怪的,這反而是正常?
這篇格子問題,其實就是不知道怎麼處理這個問題,function可以一次算5種y,可是只
能輸出一個y,sub可以輸出多個,但輸入就不能用拉的,好像要用迴圈?我還沒想通,
放假要好好想想怎麼做。
這個問題是:輸入E8到E10,為何VBA這邊只會保留一個格子,而非三個,而且這個格子
是E8而不是E10或E9。之前我有問另一個很像的,一連串的格子,大於0的有很多個,要
找出最後一個大於0的數值,我弄出來都是第一個,而soyoso的解法,我覺得很訝異,到
現在還是覺得怪怪的,應該有別的方法。
簡單的自訂函數,我想還是可以啦,我看過一個老檔案,他一個統計學的公式,寫了一
大串,連Pi=3.14...居然要寫成Const放在最前面。現在excel已經有內建這些公式了
資料最低階的處理,我已經做出來了,用VBA算是節省效能和練習寫程式吧
但是再高階的應用,礙於我的數學程度,還沒想清楚要怎麼弄出來,目前想到的做法,運
算量不小,但最搞笑的是,我不知道這樣計算是否正確,也不知道如何驗算答案...
目前的規劃:從網路抓csv檔,轉置excel,輸入vba並計算,輸出excel,人工選取需要的
資料並存在excel。是否需要csv直通vba不經過excel呢?
目前我卡在陣列:
Option Base 1
Sub testar2()
Dim i As Integer, j As Integer, ar(5, 4) As Integer
For i = 1 To 5
For j = 1 To 4
ar(i, j) = i * j
Next
Next
Range("A6").Resize(5, 4) = ar
二維陣列沒問題
Sub testar()
Dim i As Integer, ar(5) As Integer
For i = 1 To 5
ar(i) = i ^ 2
Next
Range("A6").Resize(5, 1) = ar
End Sub
一維陣列這樣只會得到5個1,好奇怪
Range("A6").Resize(1, 5) = ar
數值正常,但他是橫的,要如何變成直的?
另外我的陣列輸入這樣寫對嗎?輸入B2:B11
For i = 1 To 10
ar(i) = Range("B" & i + 1)
---
ar = Range("B2:B11")
我本來是這樣寫,但跑不出來...看網路範例都這樣呀?
用迴圈跟不用,兩者哪個比較好呢?不用迴圈的,就會變成二維陣列?
運算式本來寫 ar(i)=ar(i)*2 變成 ar(i,1)=ar(i,1)*2 不能寫ar=ar*2?
如果輸入100列2欄,輸出3欄,我是把每1欄都寫成1個一維,總共5個
是否寫成輸入陣列(100,2),和輸出陣列(100,3),這樣比較好?
或是直接一個陣列(100,5)就好了?那這個的輸出寫法是
Range("C2").Resize(100,1) = ar(100,3)
Range("D2").Resize(100,1) = ar(100,4)
Range("E2").Resize(100,1) = ar(100,5)
?這三行寫成一行有辦法嗎?或是分成輸入輸出陣列
Range("C2").Resize(100,3) = ar2
書館看書時,提到 Range("A1").Resize(i,j) = ar 優於
在迴圈內 cells(i,j) 放入陣列值(i,j) (應該是吧?)
但在這問題,是兩三個陣列好,還是一個好,似乎差不多?
如果其他差不多,維度我覺得一欄一個一維打法比較簡單,二維(i,1)跟(i,2)代表哪欄,
需要另外記名字,一維就有自己的名字。
剛剛我試了後,發現卡在如何篩選不要的元素 囧
剛剛想了一下,如果陣列用迴圈輸出到活頁,比較沒效率,那麼活頁用迴圈輸入到陣列,
應該也不好。那麼一欄一個二維陣列,似乎比較好?因為只有二維陣列可以一次輸入
居然這麼簡單!!!如果要篩選特定元素應該怎麼寫呢?
Option Base 1
Dim ar, br
ar = Range("A1:A10")(數值1到10)
For i = 1 To 10
If ar(i, 1) > 5 Then
br = ar(i, 1)
End If
Next
比如說br應該有5個元素,上面那樣寫,br是10,而br(i,1)跑不出來,若寫成
redim br(10,1)
br(i, 1) = ar(i, 1)
則會有5個「空格」,要如何讓這些空格消掉?使br只有5個元素
Dim ar, br, count As Integer
ReDim br(10)
count = 0
ar = Range("A1:A10")
For i = 1 To 10
If ar(i, 1) > 5 Then
count = count + 1
br(count) = ar(i, 1)
End If
Next
ReDim Preserve br(count)
但如果刪除第二行的redim,第一行改為dim br(10),為什麼就會卡住呢?
我覺得陣列這部份最難搞懂,搞不清楚他的規則,每次不知道為什麼卡住@@
但如果dim括號有數字,則無法用redim,是這樣嗎?這讓我想到
Dim quantity As Integer = 10 這種寫法,官網有這個範例,但我的vba跑不出來
只能 Dim quantity As Integer 然後 quantity =10
redim是這種關係,但用於陣列?
應該說redim preserve的刪除只能是最後一維,這點有點討厭,在上面的案例,在二維就
出現了@@ 沒用過二維以上的,變慢是因為要從前面的維度一個一個進出,然後增減最
後一維度?有點像用迴圈存取活頁?
上,我想10個比較好,因為(i,7)屬性是什麼?還要去查一下。但是一維不能一次從活
頁輸入資料,所以變成二維(1000,1)。那麼10個二維(1000,1)和1個二維(1000,10)哪個
好?如果沒差,我覺得10個比較好,至少名字很清楚。
redim preserve 我大概只用在前面刪空格的問題,如果本質是舊陣列搬到新陣列,而
我只是輸出到活頁,那麼更簡潔的寫法,應該是不用刪除空格,只輸出前面的元素就好
--
後來我想到,10個屬性從活頁搬進10個二維,那麼就要做10次,而1個二維只要1次,輸
出也一樣。如果真的很多,我想10個可能要減少成2~4個,1個我覺得除非都做好了,最
後再來修成這個版本吧,不適合邊寫邊改。
這三個屬性有時間、高度、重量,你覺得哪個編號是哪個屬性?對我來說,那樣的程式
碼真的不會想看第二次,最多只能都做好了,不會再改了,才能改成這樣。
ReDim Preserve ar(1 To 4) 可以跑
ReDim Preserve ar(2 To 4) 不行
而 ReDim ar(2 To 4) 會變成3個索引的空陣列,索引沒有0和1
我應該用不太到這種,而且感覺很難用@@應該只會用上面篩選那邊的方法
ReDim br(10)
ar = Range("A1:A10")
For i = 1 To 10
If ar(i, 1) > 5 Then
count = count + 1
br(count) = ar(i, 1)
End If
Next
ReDim Preserve br(count)
不到一秒。首先是數學上大量重複計算,再來程式寫得不好。用手算就會知道哪邊是重
複的,直接抄過來就好,電腦只會一直重複計算。會這樣是因為程式比較好寫又簡潔,
寫fuction只有一行,若要提昇效率,改成會記憶的變數,就好幾十行。雖然說寫程式之
前要規劃,實際是邊寫邊改,更何況新手我一直卡在奇怪的地方,不然就是不知道為什
麼跑出來是錯的。總之我差不多寫完一個簡單實用的sub,雖然結構只是大的for迴圈,
內部一個do迴圈,好幾個if。但這些不是一次寫完,而是修修改改,圖書館翻書,來這
個板求救,這樣子才成功搞定。當中我覺得,陣列跟for迴圈結合,這個技巧真的是最重
要的。
s.Cells(1, 1).Value = 123 不能這樣寫嗎?我再翻書看看
再慢慢想啦,有機會再跟你請教~
起,不然就是看不懂範例是幹嘛的?下次遇到還是不知道怎麼做。
我正在寫另外一個sub,輸入只有2欄,要做判斷,輸出一樣是2欄,我一直都是用手工做
這些。寫出來只是好幾個if,但是推倒重寫很多次,才成功跑出正確的東西。這次寫的
技術不難,但人腦邏輯怎麼化成程式邏輯很重要,好幾個if,誰在外面,誰在裡面,或
是獨立,跑出來的東西都不一樣,而且常常跟我預期的不一樣@@人腦算到一半,發現
怪怪的,可以退回重算,程式似乎很難這樣寫。
我的是要找出突出(異常)的數值,初步直覺是只有一個if,不就正常/異常兩種?但是
我的資料要判斷沒這麼簡單,這個隱含在內的邏輯至少要兩個if,2^2=4種結果,若是三
個if,2^3=8種結果,要記錄1種結果就要1個一維陣列。雖然部份結果是重複的,變數就
不用這麼多,但我還是只能把部份人腦邏輯寫出來,剩下的再慢慢想怎麼弄。
我用巢狀IF,有部份結果相同,有沒有辦法省略?
1號IF結果:a運算/b運算/c運算
2號IF結果:d運算/e運算/c運算
c運算的部份能省略為 call sub.c運算 嗎?
但是應該要有資料放進去,這部份是放在陣列,我只用過call function()
call sub 資料會放進去嗎?我還沒測試
後來想到goto這個寫法,有人說這個寫法不好,你怎麼看呢?不過我目前只想用於重複
的段落而已,用fuction和sub還是卡在怎麼傳陣列@@
這樣才會歸零,然後不知道為什麼這樣就卡住了,而且我這還會執行別的sub,本來想說
是同名的緣故?結果改名字,關掉重開還是卡,後來寫在空白活頁才正常
方法2無法執行,是少了什麼嗎?
Sub ccc()
ar = [A1:B10].Value
Call ddd(ar)
[D1].Resize(count, 1) = Application.Transpose(br)
End Sub
Sub ddd()
For i = 1 To 10
If ar(i, 2) > 0 Then
count = count + 1
br(count) = ar(i, 1)
End If
Next
End Sub
測試了後,外面有dim redim的,裡面應該也要補,變數也要補,不然不會歸零,難怪超
出陣列索引。我不太喜歡這種方法,也許等到程式很大再來用吧?小程式就先輸出到活
頁,再來做第二次的sub。
goto寫法滿方便的,但有人說不好,不知道好不好呢?我有個do迴圈,判斷式會用到do
後的結果,可是第一次需要先給這個結果,所以我把do迴圈內算式複製到前面,看了有
點討厭,因為兩者只差兩三行,其他都是一樣的。如果用goto,就可以直接進do迴圈的
中間。還有個gosub return的寫法,這個寫法比較符合我對程式的想像,也成功解決我
這個問題
...
GoSub line001
...
Exit Sub
line001:
...
Return
line002:
...
Return
End Sub
傳值、傳參考,我之前搞不清楚,現在我這樣理解:
X=10:Y=20
X、Y叫變數,一個變數等於是一個籃子(記憶體的一個單位?),兩個籃子的標籤分別
是X和Y,內容物則分別是10和20。
VBA預設是傳參考,等於說各個sub、function在計算的時候,是傳遞X、Y這種標籤,找
到籃子後,再來讀取裡面的內容、計算、更改。
比如倉庫紅色籃子是3瓶果汁,黃色籃子是10瓶果汁,員工的任務是把2瓶果汁放進紅色
籃子,那麼他應該是無中生有變出2瓶果汁,然後放進紅色籃子。這過程並沒有摸到黃色
籃子,2瓶果汁也不是從黃色籃子拿出來的。這樣嗎?
傳值不知哪邊用得到?或者其實function本身就是傳值?如果sub的參數都是傳值,那麼
就跟function差不多了?但是要弄個變數去儲存他的答案?
end sub,會消滅這個sub的籃子,除非sub外面有籃子,而且標籤要一樣,資料才會留下
來,但是傳值就不會改動籃子內的東西了。
在前面我的問題中,兩個sub是end了,但外面的籃子(陣列和變數)還在,裡面資料也
還在,所以重新計算時,就會用到這些舊資料,而非原先預期的「空」,所以要補上dim
或redim把籃子清空。
※ 編輯: j2708180 (36.239.159.74 臺灣), 05/01/2021 12:00:53
那麼什麼情況會需要把ByVal打出來呢?
※ 編輯: j2708180 (218.173.181.14 臺灣), 05/02/2021 13:25:14
... <看更多>