excel - 使用动态数组存储和粘贴值

标签 excel vba macos ms-office

首先对不起我的英语不好,这不是我的母语。
我有一个动态表,当我插入特定的键号时会更改其内容
the key number in this case is "5"
在这种情况下,keynumber 是“5”,该表的所有内容都会根据我输入的数字(从 1 到 42)而变化。
我想要做的是复制所有数据并仅将值粘贴到同一张纸上的空行中。
我用下一个代码实现了这一点:

Sheets("Biblia General").Range("B8:H142").Copy
Sheets("Biblia General").Range("M8").PasteSpecial xlPasteValues
'Remove the animation around the copied cell
Application.CutCopyMode = False
Selection.Sort key1:=Range("N8")
enter image description here
当我按下按钮 copiar 时,它会复制并粘贴到工作表的右侧。
但是现在我需要做同样的事情,但对于整个 keynumbers,例如,我需要对 1 到 42 的所有表的值进行复制和粘贴,而不仅仅是一个一个。
我不知道如何输入例如 keynumber 1 计算工作表然后复制内容并将值粘贴到右侧,然后再做一次,但对于 keynumber 2 依此类推,直到它在 keynumber 42 处结束......
有没有办法我可以做到这一点?我对 vba 不是很熟悉,但我认为我需要做一个动态数组或类似的东西
提前致谢

最佳答案

按赋值复制值

  • 当你这样做 drg.Value = srg.Value ,它与复制值(不是公式或格式)一样快。它被称为通过分配复制,并且有一个简单的规则:两个范围必须具有相同的大小(相同的行数和列数)。
    通常,您只知道目标范围的第一个单元格,并且您知道它必须与源范围的大小相同。让我们调用第一个单元格dfCell .要创建对目标范围的引用,您将执行以下操作:
    Dim drg As Range: Set drg = dfCell.Resize(srg.Rows.Count, srg.Columns.Count)
    

  • 代码
    Option Explicit
    
    Sub CopyData()
        
        Const wsName As String = "Biblia General"
        Const ClaveCount As Long = 42
        Const ClaveAddress As String = "C1" ' Clave
        Const LoteAddress As String = "C3" ' Lote
        Const srgAddress As String = "B8:H142"
        Const dfCellAddress As String = "M8"
        
        Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
        
        Dim ws As Worksheet: Set ws = wb.Worksheets(wsName)
        Dim srg As Range: Set srg = ws.Range(srgAddress)
        Dim Clave As Range: Set Clave = ws.Range(ClaveAddress)
        Dim Lote As Range: Set Lote = ws.Range(LoteAddress)
        
        Dim rCount As Long: rCount = srg.Rows.Count
        Dim cCount As Long: cCount = srg.Columns.Count
        
        Dim dfCell As Range: Set dfCell = ws.Range(dfCellAddress)
        
        Application.ScreenUpdating = False
        
        dfCell.Offset(, -1).Resize(ws.Rows.Count - dfCell.Row + 1, cCount + 1) _
            .ClearContents
        
        Dim drg As Range
        Dim dclrrg As Range
        Dim n As Long
        
        For n = 1 To ClaveCount
            Clave.Value = n
            Set drg = dfCell.Resize(rCount, cCount)
            drg.Value = srg.Value
            If n = 1 Then
                drg.Cells(1).Offset(, -1).Value = "Lote" ' Lote
                ' exclude headers
                rCount = rCount - 1
                Set srg = srg.Resize(rCount).Offset(1)
                Set drg = drg.Resize(rCount).Offset(1)
            End If
            drg.Columns(1).Offset(, -1).Value = Lote.Value ' Lote
            drg.Sort drg.Columns(2), xlAscending, , , , , , xlNo
            Set dfCell = drg.Columns(2) _
                .Find("*", , xlValues, , , xlPrevious).Offset(1, -1)
            Set dclrrg = drg.Resize(drg.Row + rCount - dfCell.Row) _
                .Offset(dfCell.Row - drg.Row, -1).Resize(, cCount + 1)
            dclrrg.ClearContents
        Next n
    
        Application.ScreenUpdating = True
        
        MsgBox "Data copied.", vbInformation, "CopyData"
    
    End Sub
    

    关于excel - 使用动态数组存储和粘贴值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70570959/

    相关文章:

    xml - 需要自动化脚本以在 XML 文件中搜索并将 HEX 替换为 DEC

    vba - 如果 D1>O1 则隐藏行

    vba - 将数字添加到文本时出错

    ms-access - 我希望从 ms-access 2013 数据库中的所有表单、报告和模块导出 vba 源代码

    linux - 什么是 "useradd -r -d/opt/otrs/-c ' OTRS 用户的 otrs"和 "usermod -G nogroup otrs www-data"的 OS X

    c++ - 如何在 Windows 和 Mac 中构建 "Auto Detect Proxy Settings"

    c# - 检索功能区对象引用的 "proper"方法是什么?

    vba - For-Next 是否有更有效的方法,包括 If-Then 语句?

    vba - 删除特定列中具有特定值的行

    mysql - 关于mac weka连接mysql