Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 削减开支;粘贴覆盖范围对象定义_Vba_Excel_Copy Paste - Fatal编程技术网

Vba 削减开支;粘贴覆盖范围对象定义

Vba 削减开支;粘贴覆盖范围对象定义,vba,excel,copy-paste,Vba,Excel,Copy Paste,我发现Excel VBA的剪切和粘贴有一个有趣的问题,涉及到使用定义的范围对象 以下是不起作用的代码: Sub PasteToRangeDoesntWork() Dim StRng As Range Dim j, k, x, y As Integer Set StRng = Range("A3") x = 0 j = Range(StRng, StRng.End(xlToRight)).Columns.Count k = WorksheetFunction.Max(Range(StRng, S

我发现Excel VBA的剪切和粘贴有一个有趣的问题,涉及到使用定义的范围对象

以下是不起作用的代码:

Sub PasteToRangeDoesntWork()
Dim StRng As Range
Dim j, k, x, y As Integer

Set StRng = Range("A3")
x = 0
j = Range(StRng, StRng.End(xlToRight)).Columns.Count
k = WorksheetFunction.Max(Range(StRng, StRng.End(xlDown)))

For y = 1 To k
    While StRng.Offset(x, 0) = y
        x = x + 1
    Wend
    If y < k Then
        Range(StRng.Offset(x, 0), StRng.End(xlDown).Offset(o, j - 1)).Select
        Selection.Cut
        Set StRng = StRng.Offset(0, j + 1)
        ActiveSheet.Paste Destination:=StRng
        x = 0
    End If
Next y
End Sub
这是有效的——即,通过不将新单元格直接粘贴到
StRng
,而是粘贴到
StRng.offset(0,1)
StRng
对象仍保持定义状态

讨论中的数据有五列。第一列是整数(值从1到7),下一列是文本,后面是日期列,最后是两列常规格式数据(2个小数点)


修复并不困难,但我不明白为什么第一个代码不起作用。有人有想法吗?

如果使用.Paste方法,则所有与粘贴边界相关的定义范围都将重置。确切的“为什么?”恐怕只有微软能解释

更好的选择是使用Range.Value和Range.Clear成员;这些不会导致此问题,速度更快,也不会弄乱剪贴板。但是请注意,这仅复制值,而不复制格式或任何公式

这方面的代码可以是这样的:

  Dim SourceRng As Range
  Set SourceRng = Range(StRng.Offset(x, 0), StRng.End(xlDown).Offset(0, j - 1))
  Set StRng = StRng.Offset(0, j + 1)
  Dim DestRng As Range
  Set DestRng = StRng.Resize(SourceRng.Rows.Count, SourceRng.Columns.Count)
  DestRng.Value = SourceRng.Value
  Call SourceRng.Clear

您的代码可能有一个输入错误;StRng.End(xlDown).Offset(o,j-1)包含一个“o”(小写字母),这是一个未定义的名称。您是否使用了Option Explicit?如果没有,最好现在就开始使用它来捕获这些类型的错误,并将“0”替换为零。非常感谢。你的建议很有效。
  Dim SourceRng As Range
  Set SourceRng = Range(StRng.Offset(x, 0), StRng.End(xlDown).Offset(0, j - 1))
  Set StRng = StRng.Offset(0, j + 1)
  Dim DestRng As Range
  Set DestRng = StRng.Resize(SourceRng.Rows.Count, SourceRng.Columns.Count)
  DestRng.Value = SourceRng.Value
  Call SourceRng.Clear