2011-02-15 20 views
1

我想在Excel 2003(不是我選擇的版本)中編寫一個VBA腳本,將工作表上的預定義範圍劃分爲十個命名範圍。工作表名稱是「paste_data」,我想限制腳本的單元格的「塊」爲A4:AO111。有時候,當我運行腳本時,它可以工作,但在其他時候,它似乎將有效的起始單元格從A4轉移到另一個單元格。這裏是一個不好的結果(對不起,因爲我是新的,我不能張貼圖片)爲例:在代碼中分配的地址與命名範圍和生成的命名範圍地址之間的斷開

命名範圍table.emergency.count是指範圍V6:當它應該是指範圍AO25 V4:AO23。

我的代碼是在這裏:

Sub tables_assign() 
Dim j As Integer 
Dim range_ref, range_name, rref As String 
Dim tbles(1 To 10) As String 
Dim rw1, rw2 As Integer 
'########################################################################################## 
'CREATION AND NAMING OF TABLES 
'########################################################################################## 
tbles(1) = "table.emergency.score": tbles(2) = "table.emergency.count": tbles(3) = "table.eol.score": tbles(4) = "table.eol.count": tbles(5) = "table.inpatient.score": tbles(6) = "table.inpatient.count": tbles(7) = "table.outpatient.score": tbles(8) = "table.outpatient.count": tbles(9) = "table.sds.score": tbles(10) = "table.sds.count" 
For j = 1 To 10 
    If j Mod 2 <> 0 Then 
     If j = 1 Then 
      rw1 = 4 
      rw2 = 23 
     Else 
      rw1 = 4 + 22 * Application.WorksheetFunction.Ceiling((j/2 - 1), 1) 
      rw2 = 23 + 22 * Application.WorksheetFunction.Ceiling((j/2 - 1), 1) 
     End If 
     rref = Trim(Application.WorksheetFunction.Substitute("=paste_data!A" & Str(rw1) & ":T" & Str(rw2), " ", "")) 
     ActiveWorkbook.Names.Add tbles(j), rref 
    Else 
     If j = 2 Then 
      rw1 = 4 
      rw2 = 23 
     Else 
      rw1 = 4 + 22 * (j/2 - 1) 
      rw2 = 23 + 22 * (j/2 - 1) 
     End If 
     rref = Trim(Application.WorksheetFunction.Substitute("=paste_data!V" & Str(rw1) & ":AO" & Str(rw2), " ", "")) 
     ActiveWorkbook.Names.Add tbles(j), rref 
    End If 
Next j 
End Sub 

有沒有人有一個想法,爲什麼會發生這種情況?我的直覺是工作表的「usedrange」是罪魁禍首。

+0

你在哪裏使用「UsedRange」?你的程序應該做什麼?總是命名範圍(「V4:AO23」)具有相同名稱(table.emergency.score,table.emergency.count等)? – CaBieberach 2011-02-15 19:22:03

+0

@CaBieberach:我的代碼中沒有明確使用UsedRange,但是我的初始(不正確)預感是我以某種方式更改了工作表的UsedRange,這影響了我命名的範圍的地址。我(在我看來)在原始文章中清楚地陳述了我的程序的作用。其目的是允許用戶將數據粘貼到分區中,並通過單擊按鈕來創建命名範圍。 – Jubbles 2011-02-15 19:52:49

回答

0

當您在定義的名稱中使用相對引用時,定義是相對於活動單元的。爲了避免這種情況,請使用絕對引用,如$ V $ 4:$ AO $ 23。對於絕對引用,命名範圍將始終指向相同的單元格。

示例: 選擇單元格A1並將名稱test_relative定義爲「= A1」。現在選擇單元格B10和重新定義的名稱框中,選擇test_relative,你會看到類似「=工作表Sheet1!B10」

要解決你的代碼,在範圍內引用將$

rref = Trim(Replace("=paste_data!$A$" & Str(rw1) & ":$T$" & Str(rw2), " ", "")) 

而且請注意,

Dim rw1, rw2 As Integer 

尺寸rw1作爲變體。使用

Dim rw1 As Integer, rw2 As Integer