问题
我经常处理的一个数据视图工作表想要重置视图部分的内容(为空(。从历史上看,我们遇到过用户说此工作表会清除他们的系统剪贴板的问题。
使用Range.ClearContents
清除这些值似乎有问题。
# Grab some data from cells onto the clipboard
Sub ClearTheClipboardWhenTheUserIsntExpectingIt()
Cells(1, 1).EntireRow.ClearContents ' Or something like that
End Sub
这应该足以复制问题。
解决方案
我的问题是关于一种可能的变通方法,那就是:
Dim r as Range
...
r.Value2 = Empty
问题
- 这是否是一个合理的解决方法
- 有没有更规范的方法可以在不清除剪贴板的情况下清除一组单元格的内容
- 我只是用错了
ClearContents
吗
我不喜欢浏览一个大的代码库并搜索/替换这种行为,如果后来发现我必须回去修复它,因为我引入了一些错误。
编辑:我应该提到我正在使用Excel2007
更新:我刚刚在一个普通的Excel电子表格中尝试了以下代码,并取得了成功:
Sub Button1_Click()
Dim clipboardText As String
clipboardText = GetTextFromClipboard()
Cells(1, 1).EntireRow.ClearContents
CopyTextToClipboard (clipboardText)
End Sub
Sub CopyTextToClipboard(ByVal inText As String)
Dim objClipboard As Object
Set objClipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
objClipboard.SetText inText
objClipboard.PutInClipboard
Set objClipboard = Nothing
End Sub
Function GetTextFromClipboard() As String
Dim objClipboard As Object
Set objClipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
objClipboard.GetFromClipboard
GetTextFromClipboard = objClipboard.GetText
Set objClipboard = Nothing
End Function
我唯一注意到的是它.ClearContents
清除了MSO剪贴板,这与Windows的剪贴板不同。这是因为.ClearContents
由于某种原因将CutCopyMode
设置为False
。
我推荐这两种:
Sub test()
Cells(1, 1).EntireRow.Value = vbNullString
End Sub
Sub test3()
Cells(1, 1).EntireRow.Value = Empty
End Sub
虽然我更喜欢brettdj的方法,只是因为它更干净(Rows(1).Value = vbNullstring
(。
此外,从帮助文件:
空
表示未将起始值分配给变量变量Empty变量在数字上下文中表示为0或字符串上下文中的零长度字符串("(。
显然,当一个单元格值设置为Empty
时,它被认为是我认为的字符串值,因为当我测试它时,它没有将单元格设置为0。因此,当将Empty
或vbNullString
应用于单元格值时,它们之间几乎没有区别。