复制范围而不是单元格

Copy range instead of cell

提问人:2mas 提问时间:11/15/2023 更新时间:11/15/2023 访问量:38

问:

Sub Progress_speichern()

    Const SRC_NAME As String = "C1 EV Application"
    Const SRC_DATE_CELL As String = "C2"
    Const DST_NAME As String = "C0 EV (Historie)"
    Const DST_DATES_LEFT_CELL As String = "S2"
    Const DST_KPI_ROW As Long = 3

    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    Dim sws As Worksheet: Set sws = wb.Sheets(SRC_NAME)
    Dim dws As Worksheet: Set dws = wb.Sheets(DST_NAME)
    Dim sDate As Date: sDate = sws.Range(SRC_DATE_CELL).value
    Dim srg As Variant: srg = wb.Sheets("C1 EV Application").Range("AD5:AD25").value

    
    Dim drrg As Range
    
    With dws.Range(DST_DATES_LEFT_CELL)
        Dim LastCol As Long:
        'find last column and define range to be used
        LastCol = dws.Cells(.Row, dws.Columns.Count).End(xlToLeft).Column 'find last cell to the right in this row
        Set drrg = .Resize(, LastCol - .Column + 1)
    End With

    
    Dim cIndex As Variant: cIndex = Application.Match(CLng(sDate), drrg, 0)
    
    ' Checks if there are values in the cell beneath the desired month. If yes, it asks the user, whether he wants to rewrite the old value, otherwise the sub is exited
    If drrg.Cells(cIndex).EntireColumn.Cells(DST_KPI_ROW).value <> "" Then

        If MsgBox("Für diesen Monat gibt es bereits alte Werte. Wollen Sie diese überschreiben?", _
        vbYesNo + vbQuestion, "Alte Werte gefunden") Then GoTo Case1 Else GoTo Case2
Case1:
                If IsNumeric(cIndex) = True Then
                        drrg(cIndex, DST_KPI_ROW).value = srg '
                        ' drrg.Cells(cIndex).EntireColumn.Cells(DST_KPI_ROW).value = srg
                End If
Case2:
                Exit Sub
                
    Else
        If IsNumeric(cIndex) = True Then
                drrg(cIndex, DST_KPI_ROW).value = srg  
        End If
    End If
    

End Sub

我有两张纸。在 Sheet1 (C0 EV (Historie)) 上输入数据。用户选择日期并按下按钮。将工作表 1 的范围复制到工作表 2。然后,从此数据范围中计算出 KPI 值。以前只复制了 KPI 值,现在我想复制整个范围,其中 kpi 值位于范围下方。KPI 值包含在范围 (AD5:AD25) 中(AD5-AD22 是值,2 个空行,然后是 KPI)。数据始终与日期匹配。工作表 2 上有固定日期(每月从单元格 S2 的水平列出)。现在,application.match 会查找匹配日期的位置,并尝试将范围粘贴到相应日期下方。

drrg.Cells(cIndex).EntireColumn.Cells(DST_KPI_ROW).value = srg

这有效,它复制单个 KPI 值。现在我基本上想复制一个范围,而不仅仅是一个单元格。

drrg(cIndex, DST_KPI_ROW).value = srg

但是行和列的参数似乎没有按照我想要的方式工作(只有一个值被复制并且在错误的位置)。

Set drrg = .Resize(, LastCol - .Column + 1)
Set drrg = .Resize(20, LastCol - .Column + 1) 'Resize the Cell to a size of 20 -> AD5:AD25 -> 21 rows

在这里,我尝试调整 drrg 的大小,我想也许我没有复制到足够宽的范围,但这也没有用。

Excel VBA

评论

0赞 Notus_Panda 11/15/2023
将范围设置为要给出新值的单元格,将要给定的值设置为第一个范围,然后它只是一个简单的 . 用于指定构建范围 DRRG 中的特定单元。您也可以以不同的方式指定它:(yourNeededColumns 可以省略)。drrg.Value = srrg.Valuedrrg(cIndex, DST_KPI_ROW)drrg(cIndex, DST_KPI_ROW).Resize(yourNeededRows, yourNeededColumns).Value = srrg.Resize(yourNeededRows,yourNeededColumns).Value
0赞 2mas 11/15/2023
不就是这样吗?我已经提到过了。我试过了:但只复制了最高值。我是哑巴还是我错过了你的答案?我也尝试过调整大小,不是吗?Dim srg As Variant: srg = wb.Sheets("C1 EV Application").Range("AD5:AD25").valuedrrg(cIndex, DST_KPI_ROW).value = srgDim srg As Variant: srg = wb.Sheets("C1 EV Application").Range("AD5:AD25").value
0赞 Notus_Panda 11/15/2023
(cIndex, DST_KPI_ROW)导致它是 DRRG 范围内的一个单元格,因此您可以获得奇异值。如果您要复制粘贴,则可以将单个单元格作为目标范围,并且仍然粘贴源范围中的所有值,但由于您使用的是 ,因此略有不同。调整大小的问题出在您的目标范围上,即 .尝试,因为 srg 是一个数组。.Valuedrrgdrrg(cIndex, DST_KPI_ROW).Resize(UBound(srg,1),UBound(srg,2)).Value = srg

答: 暂无答案