簡體   English   中英

VBA使用列號的單元格值設置功能范圍

[英]VBA Set the range for a function using the value of a cell for the column number

我對Excel VBA比較陌生。 我需要使用相應單元格的值設置許多COUNTA函數的列范圍。 每對匹配的單元格都有每個功能范圍的初始列號和最終列號。 我嘗試這樣做,將單元格的值定義為變量,然后將變量定義為以該值作為列號的地址。 像這樣:

Dim T1Address As String
T1Start = Sheets(2).Range("AQ3").Value
T1End = Sheets(2).Range("AR3").Value
T1Address = Cells(11, T1Start).Address & ":" & Cells(11, T1End).Address
Range("AT3").Select
ActiveCell.Formula = "=COUNTA('1st Sheet'!T1Address)"

問題在於該函數不起作用,無論范圍內非空單元格的數量如何,它僅顯示值“ 1”。 我了解到,也可以通過為Adress變量的范圍分配名稱來完成部分列的操作,因此我找到了一種方法來執行此操作,但它似乎也不起作用。 像這樣:

ActiveWorkbook.Names.Add _
    Name:="RangeT1", _
    RefersTo:="T1Address"

我究竟做錯了什么? 謝謝!

您將T1Address作為文字而不是變量傳遞。 嘗試這個:

ActiveCell.Formula = "=COUNTA('1st Sheet'!" & T1Address & ")"

Shai Rado的方法實際上更好。 您可以忽略SelectActiveCell而只需使用

Range("AT3").Formula = "=COUNTA('1st Sheet'!" & T1Address & ")"

我看到的另一個問題是,您正在嘗試在T1Start存儲單元格"AQ3"的值,並在T1StartT1Start單元格"AR3"T1End 不知道這是否真的是您的意圖,但我認為您的意思是獲取這些地址的列號。 如果是這種情況,請替換為:

T1Start = Sheets(2).Range("AQ3").Value
T1End = Sheets(2).Range("AR3").Value

有了這個

T1Start = Sheets(2).Range("AQ3").Column
T1End = Sheets(2).Range("AR3").Column

更新:根據您的評論,無論如何調用,您都希望引用工作簿中的第一個工作表。 以下是我所知的替代方法:

  • Sheets(1).name同時考慮圖表表和工作表
  • Worksheets(1).name僅考慮工作表
  • Sheet1.name使用工作表的名稱(不要誤認為標題,用戶可以更改標題)
  • ThisWorkbook.Worksheets(1).name在調用代碼的位置符合工作簿的條件,這意味着如果用戶打開了多個工作簿,則此工作簿仍應工作

請注意,我正在使用工作表的.name屬性,因為我不想使用整個對象。 當你說你嘗試過

Range("AT3").Formula = "=COUNTA(Sheets(1)" & T1Address & ")"  

您犯了與以前相同的錯誤,因為您將Sheets(1)作為文字而不是對象本身傳遞(這實際上也是錯誤的)。 這是您可以執行的操作:

Range("AT3").Formula = "=COUNTA('" & Sheets(1).name & "'!" & T1Address & ")" 

這里需要注意幾件事:

  • 我正在使用Sheets(1).name值作為參數,而不是文字(比較我的代碼和您的代碼中Sheets(1)的突出顯示顏色以供參考)
  • 我已經用' (單引號)將參數括起來,因為這是Excel理解的方式
  • 我也附上了! 名稱之后,因為這是Excel的語法

因此,最后假設您的工作表名為“ MyWorksheet”,並且T1Address包含“ A1”,則單元格“ AT3”的值應為=COUNTA('MyWorksheet'!A1)

您可以通過設置一個范圍,然后從中檢索Address來實現。

注意 :如果我有更多數據,例如Sheets(2) and/or “ 1st Sheet”`和/或您想放置此公式的位置可能重疊(同一張工作表)。

請嘗試以下代碼:

Dim T1Rng As Range

Set T1Rng = Range(Cells(11, Sheets(2).Range("AQ3").Column), Cells(11, Sheets(2).Range("AR3").Column))
Range("AT3").Formula = "=COUNTA('1st Sheet'!" & T1Rng.Address & ")"

您在對其他答案之一的評論中說,您不想對工作表“第一工作表”上的單元格進行計數,而是希望對當前工作簿中首先出現的任何工作表上的單元格進行計數。 如果是這樣,請從以下位置更改代碼:

Range("AT3").Select
ActiveCell.Formula = "=COUNTA('1st Sheet'!T1Address)"

Range("AT3").Formula = "=COUNTA('" & Worksheets(1).Name & "'!" & T1Address & ")"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM