返回列表 上一主題 發帖

除錯

除錯

本帖最後由 藍天麗池 於 2018-10-31 11:08 編輯

版上各位大大,小弟要修改一個之前的程式,但修改後仍有錯誤,能請版上大大幫我看看嗎??
%變動.rar (20.78 KB)

主要的錯誤是下列的程式碼,煩請版上大大幫我看看
.Offset(1).Cells(1, -1).Resize(, 1) = Rng.Cells(, -1).Resize(, 1).Value

這個程式的主要功能是其數值有變動就紀錄

回復 1# 藍天麗池
  1. .Offset(1).Cells(1, 1).Resize(, 1) = Rng.Cells(, 1).Resize(, 1).Value
複製代碼
往下填寫?
Cells沒有負數。
語法
運算式 . Cells
運算式 代表 Worksheet 物件的變數。

Offset才有負數。
語法
運算式 . Offset( RowOffset, ColumnOffset )
RowOffset        選用        Variant        該範圍要位移的列數,可為正值、負值或 0 (零)。正值表示向下位移,負值表示向上位移。預設值為 0。
ColumnOffset        選用        Variant        該範圍要位移的欄數,可為正值、負值或 0 (零)。正值表示向右位移,負值表示向左位移。預設值為 0。
一分努力,一分收穫。
發問題前可以先搜索內文是否有相關範例。

TOP

本帖最後由 n7822123 於 2018-11-1 00:36 編輯

回復 1# 藍天麗池

因為電腦找不到你要的儲存格!
.Offset(1).Cells(1, -1)=原來儲存格向下一格,向左2格

舉例
[C2].Offset(1).Cells(1, -1).Select  '=A3

但是當原來儲存格式第2欄時,要讓程式找左邊2欄的儲存格,電腦會找不到,就會跳出錯誤!
舉例如下,找不到B欄再往左2欄的欄位,所以發生錯誤
[B2].Offset(1).Cells(1, -1).Select '=?3

因為你的資料從第2欄就有開始有值,所以".Offset(1).Cells(1, -1)"就會產生錯誤

還有邏輯運算是從後面往前算
舉例來說
MsgBox True Or False And False  '=MsgBox True Or (False And False)=True
而不是
MsgBox (True Or False) And False '=False

若不想搞清楚哪個先運算的話,最好加上括弧,比較不會出錯
修改如下:
If (.Row = 2 Or .Row > 2) And .Value <> Rng.Value Then

.Row = 2 Or .Row > 2 可簡化為  .Row>=2

你的程式很多地方可以簡化
.Offset(1).Cells(1, -1).Resize(, 1) = Rng.Cells(, -1).Resize(, 1).Value
上一行等效於下一行(只有一個儲存格,不需要Resize)
.offset(1,-2)=Rng(,-1).value
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復 3# n7822123

For cts = 2 To 101
Set Rng = Cells(2, cts)
...
...

補充,你的cts從2開始
所以 "Rng(, -1).Value",要找到往左兩欄的值,也是不可能的
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復 2# faye59
所以N大,程式碼改成這樣就行嗎??
.Offset(1).Cells(1, 1).Resize(, 1) = Rng.Cells(, 1).Resize(, 1).Value

TOP

本帖最後由 准提部林 於 2018-11-1 10:51 編輯

offset , cells 可擇一用, 同時使用多此一舉!!
cells(1,0) = 向左移1格 ---   當處于A欄, 發生錯誤
cells(1,-1) = 向左移2格 --- 當處于B欄, 發生錯誤

offset(0,0) 相當于 cells(1,1),   其參數差1

取單一儲存格, 不須再用resize
EXCEL參考資料:
http://blog.xuite.net/smile1000mile/blog

TOP

回復 5# 藍天麗池


    可能你要先看一下運算式
通常我只用Cells或Range這兩個去找儲存格位置
Offset我會用於開頭時的儲存格
例如:(假設A欄位與B欄位第一個都有值)
  1. For Each A In Range("A:A")
  2. C = A.Offset(0,0).Value
  3. Next
複製代碼
  1. For Each A In Range("B:B")
  2. C = A.Offset(0,0).Value
  3. Next
複製代碼
第一個A:A
得出的C位置為Range("A1")
第二個B:B
得出的C位置為Range("B1")
有注意到嗎
明明都一樣是C = A.Offset(0,0).Value
但結果卻不一樣
Offset是有負數值得
如果再用第二個B:B去帶
C = A.Offset(0,-1).Value
C這時候的位置變成Range("A1")

然而Cells是從整張活頁簿的左上角開始計算
就像數學的X與Y軸關係
不管你怎麼寫Cells(1,1)就是Range("A1")
一分努力,一分收穫。
發問題前可以先搜索內文是否有相關範例。

TOP

回復 7# faye59


單獨Cells(?,?), 是以工作表為準(以A1為起始,向右或向下偏移), 所以[負數]或[0]不可用,
Range("H8").cells(?, ?) , 則可以H8為中心, 上下左右偏移~~正數/負數/0皆可用, 只要不超出工作表範圍~~
EXCEL參考資料:
http://blog.xuite.net/smile1000mile/blog

TOP

回復 8# 准提部林


    謝謝准大提醒!

回復 1# 藍天麗池
然而Cells是從整張活頁簿的左上角開始計算
就像數學的X與Y軸關係
不管你怎麼寫Cells(1,1)就是Range("A1")

這句話需要做更正
我想表達的是起始位置
但用錯說法
Cells並非絕對位置
一分努力,一分收穫。
發問題前可以先搜索內文是否有相關範例。

TOP

本帖最後由 n7822123 於 2018-11-5 02:56 編輯

回復 9# faye59



咳咳......其實我也有地方沒講清楚,
為了避免誤導別人,我還是自我糾正一下,
邏輯運算是從後面往前算
這句話只有For該運算式
實際上是 "And" 會比 "Or" 先算
所以該式會變成後面的先算
如果想要Or先算,需要加上括弧
看了下圖就明瞭了

111.png
2018-11-5 02:47
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

        靜思自在 : 盡多少本份,就得多少本事。
返回列表 上一主題