Board logo

標題: [發問] 若儲存格內容為0就整列不顯示 [打印本頁]

作者: oak0723-1    時間: 2010-9-6 19:09     標題: 若儲存格內容為0就整列不顯示

本帖最後由 oak0723-1 於 2010-9-6 21:17 編輯

如附件
在工作表1之[c10:m83]輸入資料
想得到如工作表2-1之結果
也就是說當工作表2-1的j欄內容經計算為0時就不將該列顯示於工作表2-1

為方便說明
附件中工作表2不論j欄內容是否為0將全部顯示出來之情形
而附件中工作表2-1是將j欄內容為0不顯示之情形
作者: oobird    時間: 2010-9-6 21:06

請仔細檢查附件中最後3欄結果與說明上的算法並不相符。
作者: oobird    時間: 2010-9-6 21:42

為何前幾欄取自表1第10列,而後面的取第13列?
作者: oobird    時間: 2010-9-6 22:12

j欄公式為='1'!M10+'1'!L10,說明為''此欄數值為工作表1(第m欄減第l欄)…如儲存格內式子但當此欄數值為零時就整列不顯示''
這又是怎麼回事?
作者: oak0723-1    時間: 2010-9-6 22:20

本帖最後由 oak0723-1 於 2010-9-6 22:29 編輯

回復 6# oobird


    喔
抱歉可能小弟寫沒清楚
意思就是說
若工作表1裡的M10+L10=0
在工作表2就不顯示該列(第10列)
已修正如附件~~~
作者: oobird    時間: 2010-9-6 22:26

Sub yy()
Dim rng, arr, i%, j%, k%
With Sheets("1")
rng = .Range(.[c10], .[m83].End(3))
End With
ReDim arr(1 To UBound(rng), 1 To 10)
For i = 1 To UBound(rng)
If rng(i, 11) - rng(i, 10) <> 0 Then
k = k + 1
For j = 1 To 6
arr(k, j) = rng(i, j)
Next
arr(k, 8) = rng(i, 8) - rng(i, 6)
arr(k, 9) = arr(k, 8) - arr(k, 6)
arr(k, 10) = rng(i, 11) + rng(i, 10)
End If
Next
Sheets("2").UsedRange = ""
Sheets("2").[a5].Resize(k, 10) = arr
End Sub
作者: oobird    時間: 2010-9-6 22:28

If rng(i, 11) - rng(i, 10) <> 0 Then
這一行視你要加或減
作者: oak0723-1    時間: 2010-9-7 00:30

回復 7# oobird


    請問
之前提到
動態陣列有個規則,就是只能改變第二維的大小
http://forum.twbts.com/viewthread.php?tid=1282
這裡卻arr(1 To UBound(rng), 1 To 10)
變數設在第一維
也就是列位為變數
這~~~到底是位什麼?
作者: oobird    時間: 2010-9-7 07:56

這個不是動態陣列,變數可設在任何一維。
因為你不習慣transpose,所以放棄動態陣列,這樣你可能較容易吸收!
作者: oak0723-1    時間: 2010-9-7 09:21

回復 9# oobird


    完了~~~
我又看不懂了
我買的書上提到
固定陣列是以dim宣告
變動陣列是以Rerdim宣告
此處及http://forum.twbts.com/viewthread.php?tid=1282
這2個問題不是都用redim宣告嗎?
作者: oobird    時間: 2010-9-7 09:42

固定陣列是以dim宣告
那是在事先知道大小的情況。
但是我們是在執行到rng = .Range(.[c10], .[m83].End(3))
時才知道須要的大小(雖然不是準確)
這時就要重新定義他的大小,所以用redim!
作者: oak0723-1    時間: 2010-9-7 10:46

回復 11# oobird


陣列1>
a = Sheets("1").[c10].CurrentRegion
    r = 1
    For i = 1 To UBound(a)
        ReDim Preserve arr(1 To 3, 1 To r)
        arr(1, r) = a(i, 1): arr(2, r) = a(i, 2): arr(3, r) = a(i, 3)
        r = r + 6
    Next
陣列2>
With Sheets("1")
rng = .Range(.[c10], .[m83].End(3))
End With
ReDim arr(1 To UBound(rng), 1 To 10)
For i = 1 To UBound(rng)
If rng(i, 11) - rng(i, 10) <> 0 Then
k = k + 1
For j = 1 To 6
arr(k, j) = rng(i, j)
Next
小弟比較了這2個陣列
發現在陣列2的rng變數的定義
rng = .Range(.[c10], .[m83].End(3))
等於設定了rng的起始與終止範圍
而在陣列1的r變數
是受制於變數a而終止
變數a的定義為
a = Sheets("1").[c10].CurrentRegion
這等於沒有設定變數a的終止範圍
所以大大你才將陣列1稱之為變動陣列
陣列2稱之為固定陣列
而非單純以dim或redim作判別基準區分固定或變動陣列?
小弟這樣理解正確嗎?
作者: luhpro    時間: 2010-9-7 22:10

本帖最後由 luhpro 於 2010-9-7 22:32 編輯

回復 10# oak0723-1

其實在上面的程式中之所以可以用 ReDim 來重新配置 Arr 為一陣列是因為 Arr 初始宣告時是 Variant 型態,
所以它也可以表示為是一個(尚未定義大小的)陣列.

你可以開啟Excel VBA 的說明來看,
它對於 ReDim 的 解釋如下 :
ReDim 陳述式是用來 "決定" 或 "重新決定" 動態陣列的大小


回復 12# oak0723-1

我覺得不管是 .CurrentRegion 還是 .End(3) 兩者在程式執行到該行時都會是個確定的範圍,

之所以 ReDim Preserve arr(1 To 3, 1 To r) 會說它是個動態陣列,
是因為它在之前已經有被定義過陣列大小了, (因在迴圈中會重複執行該敘述數次)
之後還需要因 r 值而變動其大小故而是動態陣列.

至於

ReDim arr(1 To UBound(rng), 1 To 10)

則因該敘述之前只有 Dim arr 一個敘述, (也可視為 Variant 變數)
其實並沒有真的明確定義過 arr 這個陣列的大小,
直到該敘述才是真的將其定義為一個 "固定大小" 的陣列.




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)