我一直在尝试构建一个实用程序,允许用户在列(或行)中选择公式,并使用Transpose
PasteSpecial
方法将这些公式转换为行(或列) 。我让它适用于特定的目标单元格,但是一旦我尝试让用户控制目标单元格,我就会收到运行时错误1004“Range类的PasteSpecial方法失败”。
以下是工作代码(假设所选公式均不在Range("E3")
中:
Dim rSelection As Range
Set rSelection = Selection
Call MakeSelectionAbsolute(rSelection)
rSelection.Copy
Dim rMoveTo As Range
Set rMoveTo = Range("E3")
With rMoveTo
.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Call MakeSelectionRelative(Selection)
End With
rSelection.Delete
我已经尝试了几种方法(包括将返回值的UDF),但我认为问题源于使用输入框。我目前的尝试是用这个替换Set rMoveTo = Range("E3")
:
On Error Resume Next
Application.DisplayAlerts = False
Set rMoveTo = Application.InputBox(Prompt:= _
"Select the first cell of the range you want to transpose to.", _
Title:="SPECIFY RANGE", Type:=8)
Application.DisplayAlerts = True
On Error GoTo 0
在我看来,这种替代应该有效。我尝试在rMoveTo上添加一个手表,看起来它为我选择的单元格设置了一个值(但我承认我还不知道如何读取为一个范围生成的所有手表数据)。
运行时错误1004发生在.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
为什么这种方法不起作用,如何修复?这看起来似乎很简单,但我不知道那是什么。
答案 0 :(得分:2)
剪贴板对UI操作非常敏感。当您使用Application.InputBox
选择范围时,剪贴板正在清除,PasteSpecial
失败,因为没有要粘贴的内容。
更改操作顺序:首先选择范围,然后复制/粘贴:
Dim rSelection As Range
Set rSelection = Selection
Call MakeSelectionAbsolute(rSelection)
On Error Resume Next
Application.DisplayAlerts = False
Set rMoveTo = Application.InputBox(Prompt:= _
"Select the first cell of the range you want to transpose to.", _
title:="SPECIFY RANGE", Type:=8)
Application.DisplayAlerts = True
On Error GoTo 0
'if user select nothing - exit sub
If rMoveTo Is Nothing Then Exit Sub
'copy AFTER user select range
rSelection.Copy
With rMoveTo
.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Call MakeSelectionRelative(Selection)
End With
rSelection.Delete