2017-06-21 342 views
0

我的工作表有29行和39列。 目前我使用ActiveSheet.UsedRange.Rows.count在每次運行時給出錯誤和不同的結果

lrow = ActiveSheet.UsedRange.Rows.count - >爲獲得使用的行數
lColumn = ActiveSheet.UsedRange.Columns.count - >爲獲得使用的列數

Excel中給出錯誤計數每次運行時。有時,它給:
行:29列:784
在其他運行它給
行:32755和列:784
和其他運行它給不同的值。

我檢查過29行後有39列沒有垃圾數據。此外, 上填充數據我清除與片:ActiveWorkbook.Worksheets("Field Difference").Cells.Delete

我希望ActiveWorkbook.Worksheets("Field Difference").Cells.Delete完全清除片和清除垃圾數據,如果任何在紙張的紙。我還能如何確保工作表中沒有垃圾數據。

我也明白,我們還有其他選項,如:
ActiveWorkbook.Worksheets("Field Difference").UsedRange.ClearContents - 只清除內容
ActiveWorkbook.Worksheets("Field Difference").UsedRange.Clear - 清除格式化爲好。

請讓我知道爲什麼我得到了錯誤的行數和列數值以及出路。我可以使用其他可靠的方法來獲得UsedRange行數和UsedRange列數。

+1

簡短的回答:避免使用'ActiveSheet'和'UsedRange',他們都是不可靠的,特別是結合時... –

+0

如何解決而後卻發現UsedRange行和列? – sid

+1

我不能聲稱[這個答案],但基本上'UsedRange'在所有條件下都不可靠。舉個例子,當數據從一個範圍中被清除後,Excel仍然會將這些單元記錄爲「已使用」。鏈接的例子給出了確定當前使用範圍的方法。 – PeterT

回答

1

工作表佈局會影響.UsedRange和.CurrentRegion屬性。對於最後的「最後一個單元格」,從A1開始按行向後搜索,然後按照使用毯子通配符的列向後搜索。

dim lr as long, lc as long 

with worksheets("sheet1") 
    lr = .cells.find(what:=chr(42), after:=.cells(1), searchdirection:=xlprevious, _ 
        lookat:=xlpart, searchorder:=xlbyrows, lookin:=xlformulas).row 
    lc = .cells.find(what:=chr(42), after:=.cells(1), searchdirection:=xlprevious, _ 
        lookat:=xlpart, searchorder:=xlbycolumns, lookin:=xlformulas).column 
    debug.print .cells(lr, lc).address(0, 0) 

end with 

enter image description here

3

去年行和列列A:

Dim sht as Worksheets 
dim lRow as Long 
Set sht = Worksheets("Field Difference") 

lRow = sht.Cells(sht.Rows.Count, 1).End(xlUp).Row 
lCol = sht.Cells(1, sht.Columns.Count).End(xlToLeft).Column 
+0

如果.UsedRange和/或.CurrentRegion不提供所需的答案,那麼通常情況下,數據不會遵循A1中開始並向外輻射的熟悉模式。授予OP並不認爲提供數據佈局的快速截圖並不重要,但該解決方案在許多情況下不起作用。 – Jeeped

1

方法找到了列(行)的最後一個單元格人口是衆所周知的。使用該列(行)的最後一個單元的End(xlUp)End(xlToLeft))。

要獲得實際上填充的工作表區域的最後一個單元格,您可以使用此自定義功能,將它讓你可靠:

Public Function getLastCell(sh As Worksheet) As Range 
    Dim lastRow As Long, lastCol As Long 
    lastRow = sh.Cells.Find("*", sh.Cells(1, 1), xlFormulas, xlPart, xlByRows, xlPrevious).Row 
    lastCol = sh.Cells.Find("*", sh.Cells(1, 1), xlFormulas, xlPart, xlByColumns, xlPrevious).Column 

    Set getLastCell = sh.Cells(lastRow, lastCol) 
End Function 

通過將最後一個單元格,就可以得到整個範圍A1到該小區,使用

mysheet.Range("A1", getLastCell(mySheet)) 

有時候你可能有興趣在尋找未開始A1的居住區。可以,在這種情況下,發現同樣的實際居住區域的「左上」細胞,使用該自定義函數:

Public Function getFirstCell(sh As Worksheet) As Range 
    Dim lastRow As Long, lastCol As Long 
    lastRow = sh.Cells.Find("*", sh.Cells(sh.Rows.Count, sh.Columns.Count), xlFormulas, xlPart, xlByRows, xlNext).Row 
    lastCol = sh.Cells.Find("*", sh.Cells(sh.Rows.Count, sh.Columns.Count), xlFormulas, xlPart, xlByColumns, xlNext).Column 

    Set getFirstCell = sh.Cells(lastRow, lastCol) 
End Function 

最後,你可以加入的兩個單元,以獲得實際ppulated區域,像這樣的:

mysheet.Range(getFirstCell(mySheet), getLastCell(mySheet)) 
相關問題