Board logo

標題: range離奇問題 [打印本頁]

作者: HSINLI    時間: 2015-7-4 09:28     標題: range離奇問題

不好意思,想問一個很離奇的問題
就是指定這個對象時
Range("A" & i * 100 + 88 & ":l100")
所呈現的範圍卻是
$A$100:$L$188

但指定這個對象
Range("A" & i * 100 + 88 & ":l1000")
所呈現的範圍又是
$A$188:$L$1000

請問問題出在哪裡?
作者: jackyq    時間: 2015-7-4 09:59

你的是 mac 系統
是否與此有關?
作者: lpk187    時間: 2015-7-4 11:29

本帖最後由 lpk187 於 2015-7-4 11:40 編輯

回復 1# HSINLI


    這樣沒問題啊!假如範圍A1:C10好了,你也可以標示A10:C1的兩種寫法都對
範圍在一般寫法數字小的列會在前面,數字大的會在後面
依$A$100:$L$188的寫法和$A$188:$L$100其實是一樣的!
而$A$188:$L$1000,188的數字比1000小所以電腦直接判斷為$A$188:$L$1000,但若用人工寫的也可以寫$A$1000:$L$188
  1. Public Sub test()
  2. Range("A10:c1").Select
  3. Range("A1:c10").Select
  4. End Sub
複製代碼
上面代碼答案結果都是一樣的!
作者: jackyq    時間: 2015-7-4 11:44

回復 3# lpk187

有道理
目前得到的結論是
EXCEL 會自動把小的值放前面, 大的值放後面
就能夠同一 標準
目的可能是這樣才能互比

例如
以下其實是相同區域的  
Range("A2: C100")  EXCEL  如果回傳 "A2:C100"
Range("A100: C2")  EXCEL  如果回傳 "A100:C2"
IF"A2:C100" <> "A100:C2" Then
    Msgbox "這是不同的選取區"
End iF
要避免這種錯誤,  EXCEL 就必須統一標準
作者: lpk187    時間: 2015-7-4 11:57

本帖最後由 lpk187 於 2015-7-4 11:59 編輯

回復 4# jackyq


IF"A2:C100" <> "A100:C2" Then
    Msgbox "這是不同的選取區"
End iF
上面代碼是兩組不同的字串
範圍則是位置,是相同的!如下:
If Range("A10:c1").Address <> Range("A1:c10").Address Then
    MsgBox "這是不同的選取區"'
End If
所以這不是錯誤!
作者: jackyq    時間: 2015-7-4 12:25

回復 5# lpk187

你誤會我的意思
版大他其實就是問
Range("A10:c1").Address = 為何 EXCEL 不是傳回 "A10:c1" 反而傳回  "A1:c10"
Range("A1:c10").Address = "A1:c10"

我要跟他說 Range("A10:c1") 和 Range("A1:c10") 其實是相同的選取區
如果 EXCEL 它設計成 一個傳回 "A1:c10" 另一個卻傳回"A10:c1"
將導致發生以下的錯誤現象
IF "A1:c10" <> "A10:c1" Then   (  if Range("A1:c10").Address  <> Range("A10:c1").Address  then )
    Msgbox "這是不同的選取區"
End iF

所以 EXCEL 才會把 Range("A10:c1").Address = 改成傳回  "A1:c10"
這樣就不會出現以上的問題

版大他就是無法理解為何  Range("A10:c1").Address  為何不是傳回 "A10:c1" 而是傳回 "A1:c10"
我要告訴他的是如果  Range("A10:c1").Address   傳回的是  "A10:c1"
將會引發下列的錯誤
IF Range("A1:c10").Address  <> Range("A10:c1").Address  Then
    Msgbox "這是不同的選取區"
End iF
這也就是我認為 EXCEL 為何不傳回 "A10:c1" 的原因

你...沒看清楚我的意思
作者: jackyq    時間: 2015-7-4 12:33

不好意思, 上面寫得也點雜
想修改已經超過3分鐘無法修改


你誤會我的意思
版大他就是無法理解為何  Range("A10:c1").Address  為何不是傳回 "A10:c1" 而是傳回 "A1:c10"
我要告訴他的是如果  Range("A10:c1").Address   傳回的是  "A10:c1"
將會引發下列的錯誤
IF Range("A1:c10").Address  <> Range("A10:c1").Address  Then
    Msgbox "這是不同的選取區"
End iF
把 Range("A1:c10").Address  直接以值來替代就變為如下
IF ("A1:c10") <> "A10:c1" Then
    Msgbox "這是不同的選取區"
End iF

這也就是我認為 EXCEL 為何不傳回 "A10:c1" 的原因

你...沒看清楚我的意思
作者: HSINLI    時間: 2015-7-4 14:05

喔喔!了解了!
所以說excel會自動將數字小得換到前方,但是所選取的範圍一樣沒有變更
是這樣嗎??
作者: HSINLI    時間: 2015-7-4 15:28

不好意思,想要再詢問一下
range這樣的寫法出了什麼問題嗎?
Range("a" & i - 1 * 100 + 88 & ":l " & i * 100 + 88).Copy j
為什麼每次執行的時候都出現1004錯誤

整組code見附件,主要是要用vba叫ie,複製貼上其內容至excel
(會這樣操作是因為該網址無法用querytable下載)
  1. Sub 擷取yahoofinanceetf()

  2. Dim j As Range
  3. Dim i As Integer
  4. Dim url As String

  5.     Cells.Clear
  6.    
  7.     Application.ScreenUpdating = False
  8.     Set ie = CreateObject("internetexplorer.application")

  9. For i = 1 To 16 '欲複製下載的網頁頁數有16頁
  10.     With ie
  11.         .Visible = False
  12.         .Navigate "http://finance.yahoo.com/etf/lists/?mod_id=mediaquotesetf&tab=tab4&scol=avgcap&stype=desc&rcnt=100&page=" & i

  13.     Do While .ReadyState <> 4
  14.         DoEvents
  15.     Loop
  16.         .ExecWB 17, 2
  17.         .ExecWB 12, 2
  18.    End With
  19.   If i = 1 Then '如果是第一頁的話從A1開始貼
  20.         Range("A1").Select
  21.         ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:= _
  22.                 False, NoHTMLFormatting:=True
  23.    
  24.     Range("a87:l187").Copy Range("a1") '因為是全頁複製故只將所需的表格複製貼上到指定位置
  25.     Range("a102:l302").Clear '除以上所需外之後的內容清除

  26. Else '如果是第二頁之後的內容
  27.      Set j = Cells(Rows.Count, "a").End(xlUp).Offset(1) '將range J指定在使用過儲存格的下一個空白儲存格
  28.       j.Select
  29.       ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:= _
  30.                 False, NoHTMLFormatting:=True
  31.    Range("a" & i - 1 * 100 + 88 & ":l " & i * 100 + 88).Copy j  '將所需的資料貼至range j
  32.    j.EntireRow.Delete '將那一行整行刪除,因為是標題列,前面已有同樣內容
  33.    Range("a" & i * 100 + 2 & ":l65536").Clear '除所需部份,其餘內容清除
  34.    Set j = Nothing '清除j的賦值,下次循環再重新定義新的range j
  35.   End If
  36. Next i

  37. ie.Quit

  38. End Sub
複製代碼

作者: jackyq    時間: 2015-7-4 16:09

i - 1 * 100 應該是寫成   (i - 1) * 100
作者: lpk187    時間: 2015-7-4 16:29

回復 9# HSINLI


    "i - 1 * 100 + 88"是為負值range不可能有負值的!
作者: HSINLI    時間: 2015-7-4 23:50

您好,謝謝你的回答,
我試過了目前改成
Range("a" & (i - 1) * 100 + 88 & ":l " & i * 100 + 88).Copy j
但還是卡在這邊無法執行耶><
作者: jackyq    時間: 2015-7-5 07:11

回復 12# HSINLI


    Range("a" & (i - 1) * 100 + 88 & ":l " & i * 100 + 88).Copy j

":l " 改成  ":l"  右端你多了一個空白

.Copy   j   的用法錯誤,  請字型參考  https://msdn.microsoft.com/zh-tw/library/office/ff837760.aspx
作者: HSINLI    時間: 2015-7-5 08:27

已解決了!謝謝你!




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