不知道我错过了什么,但我看到的示例似乎没有用。
我从网络查询导入数据。我设置查询以在重新查询时清除未使用的单元格。
我使用此导入的数据生成可变长度的报告。
但是,如果用户(因为他们需要在我的情况下)插入行,则会扩展ActiveSheet.UsedRange。这意味着我不能再做一个" Ctrl-End"在执行新查询时查找数据集中的最后一行。
我可以使用ActiveSheet.UsedRange.Clear轻松清除任何数据。但是,如果先前的查询生成了2或3页报告,那么任何后续查询也将是那么长,即使数据较少,因为" UsedRange"仍然指向最后一排那里。
示例如
ActiveSheet.UsedRange
ActiveSheet.UsedRange.Clear
a = ActiveSheet.UsedRange.Rows.Count
不要重置范围。
MS将UsedRange定义为readOnly属性。
似乎需要发生的事情是"文件保存"为了完成行动。
ActiveWorkbook.Save
有一篇帖子指出,在旧版本的Excel中,您还必须关闭工作簿并重新打开它才能完成操作。
我想知道 1.此行为发生变化的版本截止点是什么? 2.是否有其他方法使用VBA宏来重置范围?
答案 0 :(得分:2)
最适合我的代码:
Sub DeleteUnused()
Dim myLastRow As Long
Dim myLastCol As Long
Dim dummyRng As Range
Dim AnyMerged As Variant
'http://www.contextures.on.ca/xlfaqApp.html#Unused
'Helps to reset the usedrange by deleting rows and columns AFTER your true used range
'Check for merged cells
AnyMerged = ActiveSheet.UsedRange.MergeCells
If AnyMerged = True Or IsNull(AnyMerged) Then
MsgBox "There are merged cells on this sheet." & vbCrLf & _
"The macro will not work with merged cells.", vbOKOnly + vbCritical, "Macro will be Stopped"
Exit Sub
End If
With ActiveSheet
myLastRow = 0
myLastCol = 0
Set dummyRng = .UsedRange
On Error Resume Next
myLastRow = _
.Cells.Find("*", after:=.Cells(1), _
LookIn:=xlFormulas, lookat:=xlWhole, _
searchdirection:=xlPrevious, _
searchorder:=xlByRows).Row
myLastCol = _
.Cells.Find("*", after:=.Cells(1), _
LookIn:=xlFormulas, lookat:=xlWhole, _
searchdirection:=xlPrevious, _
searchorder:=xlByColumns).Column
On Error GoTo 0
If myLastRow * myLastCol = 0 Then
.Columns.Delete
Else
.Range(.Cells(myLastRow + 1, 1), _
.Cells(.Rows.Count, 1)).EntireRow.Delete
.Range(.Cells(1, myLastCol + 1), _
.Cells(1, .Columns.Count)).EntireColumn.Delete
End If
End With
End Sub
答案 1 :(得分:0)
如果您单独拨打Worksheet.UsedRange property,它将会重置。
With Worksheets("Sheet1")
Debug.Print .UsedRange.Address(0, 0)
.UsedRange.Clear
.UsedRange '<~~ called by itself will reset it
Debug.Print .UsedRange.Address(0, 0)
End With
在安装了所有适当的服务包的xl2010及更高版本中,此额外步骤是不必要的。
答案 2 :(得分:0)
以下是我插入代码的方式。
Sheets("Edit Data").Select
' Range("A6").Select
' Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
' Selection.Delete Shift:=xlUp
' ActiveWorkbook.Save
With Worksheets("Edit Data")
Debug.Print .UsedRange.Address(0, 0)
.UsedRange.Clear
.UsedRange '<~~ called by itself will reset it
Debug.Print .UsedRange.Address(0, 0)
End With
范围的结束应该是i7而不是它仍然是i26
然而,我注释掉的代码确实将范围重置为i7
从你所说的只是确认。我注释掉的代码仅适用于Excel 2010及更高版本。我们有一些2007版本。对于那些工作簿实际上必须关闭并重新打开以重置范围?
注意 - 代码示例在2016版本上执行
答案 3 :(得分:0)
这可能适合或不适合您的数据需求,但如果您的数据全部在一个连续的块中,您可以使用CurrentRegion而不是UsedRange,如下所示:
With Cells(1, 1).CurrentRegion
MsgBox "I have " & .Rows.Count & " rows and " & .Columns.Count & " columns of data."
End With
当然,如果您关注的区域不是从单元格A1开始,或者您的工作表包含您关心的多个连续区域,则此选项将不起作用。根据数据的可预测程度,通常可以在每个数据块中找到至少一个单元格,一旦有了这个单元格,CurrentRegion将为您提供整个数据块的范围。
答案 4 :(得分:0)
我已经使用了Jeeped解决方案并在我添加时为我工作。激活,所以:
With Worksheets("Sheet1")
Debug.Print .UsedRange.Address(0, 0)
.UsedRange.Clear
.UsedRange
.Activate
Debug.Print .UsedRange.Address(0, 0)
End With
我正在使用Excel2013
答案 5 :(得分:0)
感谢克劳斯提供了正确的答案,但是答案还不完整,他在主要帖子上发表了评论,以完成此操作。我将在此处回答,以将有用的内容组合为一个可行的解决方案。
注意:我没有尝试变型来查看哪些步骤是必需的,但是这些步骤可以清除不必要的使用范围。
Sub ResetUsedRange()
dim rngToDelete as range
set rngToDelete = 'Whatever you want
rngToDelete.EntireRow.Clear
rngToDelete.EntireRow.Select
Selection.Delete Shift:=xlUp
ActiveWorkbook.Save 'This step has been stated to be necessary for the range to reset.
End Sub
答案 6 :(得分:0)
这是我使用的解决方案。
Sub CorrectUsedRange()
Dim values
Dim usedRangeAddress As String
Dim r As Range
'Get UsedRange Address prior to deleting Range
usedRangeAddress = ActiveSheet.UsedRange.Address
'Store values of cells to array.
values = ActiveSheet.UsedRange
'Delete all cells in the sheet
ActiveSheet.Cells.Delete
'Restore values to their initial locations
Range(usedRangeAddress) = values
End Sub
答案 7 :(得分:0)
适用于所有版本的excel
答案 8 :(得分:0)
我只需要使用 Worksheets(“ Sheet1”)。UsedRange.Calculate 删除行以重置范围后。
答案 9 :(得分:0)
这对我有用:
Worksheets("Sheet1").UsedRange.Clear
Worksheets("Sheet1").UsedRange = ""
似乎将一个值插入UsedRange会将其重置。完成此操作后,我可以去
MyCurrentRow = Worksheets("Sheet1").Range("A:A").SpecialCells(xlCellTypeLastCell).Row
MyCurrentRow现在回到1,我可以从那里开始计数。当我未将值分配给UsedRange时,该LastCell值未重置。无需保存。
答案 10 :(得分:0)
这就是最终为我工作的原因。我觉得必须有更好的方法,但没有其他方法适合我。
Sub ClearRangeData()
Dim S1 As Worksheet
Set S1 = Sheets("Your Sheet Name") 'Define what sheets we are using
'------- Remove all the old data -----
S1.Activate
With ActiveSheet
S1_rows = S1.UsedRange.Rows.Count
For I = S1_rows To 1 Step -1
Cells(I, 1).EntireRow.Delete
Next
End With
End Sub
答案 11 :(得分:-1)
我仔细检查以确保已经安装了所有最新的补丁和服务包,并且它们是。
我正在跑步 Windows 10和 Excel 2016版本16.0.6568.2034我发现范围只会通过
重置ActiveSheet.UsedRange.Clear
最重要的是
ActiveWorkbook.Save
没有save命令,范围不会重置
答案 12 :(得分:-1)
这适用于Excel 2010:
fileName = "C:\Users\Jeff Hardy\Desktop\index.txt"
chars = 0
words = 0
lines = 0
def file_stats(in_file):
global lines, words, chars
with open(in_file, 'r') as fd:
for line in fd:
lines += 1
wordsList = line.split()
words += len(wordsList)
for word in wordsList:
chars += len(word)
file_stats(fileName)
print("Number of lines: {0}".format(lines))
print("Number of words: {0}".format(words))
print("Number of chars: {0}".format(chars))