- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-5-5
|
18#
發表於 2022-10-31 10:50
| 只看該作者
本帖最後由 Andy2483 於 2022-10-31 10:53 編輯
回復 12# 准提部林
'謝謝前輩
'這帖學到
'1.資料型態:長整數的最小值 是-2147483648
'2.知道什麼是數字溢位
'3.不能只看問題的正面!負面的也要考慮!畢竟主角是數字
'4.防誤判是很重要的事!
'5.很多知識與學問是練習才能體會的!
'6.天助自助人助
請前輩再指導!謝謝
Option Explicit
Sub TEST()
Dim Arr, V&, U1&, U2&, i&, j%, T$
'↑宣告變數
Arr = Range([A1], [m65536].End(xlUp))
'↑令Arr是陣列!倒入[A1]到M欄最後一個有內容儲存格,擴展到方正最小區域儲存格值
For i = 1 To UBound(Arr)
'↑設外順迴圈!從1到Arr陣列縱向最後一列數
V = -9 ^ 9
'↑令V數字是9的9次方負值=(9 ^ 9)*(-1)= -387420489
'查詢了VBA 的資料型態: V& 長整數的最小值 是-2147483648 !
'為什麼不用它當V值?? 因為後方程序會讓變數溢位(比 -2147483648 更小)
'因為V的初始值是0 如果一開始沒有給V一個第一使用值
'後方的程序會誤判[A1]=1 時連續
For j = 1 To UBound(Arr, 2)
'↑設內順迴圈!從1到Arr陣列橫向最後一欄數
U1 = Arr(i, j)
'↑令U1是Arr陣列內外迴圈的主角(數字)
U2 = U1
'↑U2 = U1是為了 消除U2在前次迴圈中殘餘數字(U2初始值是0)
If j < UBound(Arr, 2) Then
'↑如果j這內迴圈數小於 Arr陣列橫向最後一欄數
U2 = Arr(i, j + 1)
'U2就變心成為 U1主角右邊格的那個值(數字)
End If
If U1 - V = 1 Or U2 - U1 = 1 Then
'↑如果主角U1 - V =1,是要判斷負數值的連續
'或 變心U2的-主角U1=1
T = T & "," & U1
'↑令T =T字串連接 "," 符號 ,再連接主角U1
V = U1
'↑令V數字是主角U1值
End If
Next j
Arr(i, 1) = Mid(T, 2)
'↑令外迴圈Arr陣列的第一欄取內迴圈 T字串裡的第2個字開始(含自己)的全部字串
'↑Mid(T, 2)後學今天才知道可以這樣陳述!以前都用Mid(T, 2,99)
'因為第一個字是 "," 符號
T = ""
'↑令清空 T字串
Next i
[O1].Resize(UBound(Arr)) = Arr
'↑Arr陣列 從[O1]開始貼入 Arr陣列縱向最後一列數,只貼入1欄位資料
'同[O1].Resize(UBound(Arr), 1) = Arr,1可以省略
End Sub
執行前:
執行結果:
|
|