RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1225670
Accepted
2b4fITin
2b4fITin
Asked:2021-12-30 19:02:35 +0000 UTC2021-12-30 19:02:35 +0000 UTC 2021-12-30 19:02:35 +0000 UTC

为什么 Pastespecial 中有错误?

  • 772

同事!帮我弄清楚:我不能以任何方式只插入值​​​​​)。

Sub GetTransactions()

    Dim my_FileNameLong As Variant
    Dim my_FileNameShort As Variant
    Dim sh As Worksheet
    Dim wb As Workbook
    Dim ListName As String
    Dim FinalRow As Integer
    Dim i As Long
    
    Set wb = ThisWorkbook
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculateManual
    
    'Открываем файл (только для чтения) с операциями за текущий месяц + определяем переменную my_FileName
    my_FileNameLong = Application.GetOpenFilename(filefilter:="Excel Files,*.xl*;*.xm*")
    
    If my_FileNameLong <> False Then
        Workbooks.Open Filename:=my_FileNameLong, ReadOnly:=True
    End If
    
    'Определяем короткое имя файла с операциями, чтобы потом (после копирования данных) его закрыть по имени
    my_FileNameShort = ActiveWorkbook.Name
    
    'Определяем имя закладки, с которой будем брать информацию
    ListName = InputBox("Введите имя листа, с которого берём информацию")
    
    Worksheets(ListName).Activate
    
    'Работаем с информацией на выбранной закладке:
    'Определяем последнюю строку на выбранном листе в файле-источнике
    FinalRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = 4 To FinalRow
        'Sheets(ListName).Range("aw" & i & ":cj" & i).Copy wb.Sheets("CAPEX").Range("a" & Rows.Count).End(xlUp).Offset(1)
        Sheets(ListName).Range("aw" & i & ":cj" & i).Copy
        wb.Sheets("CAPEX").Range("a" & Rows.Count + 1 & ":an").PasteSpecial xlPasteValues
    Next i
    
    Application.CutCopyMode = False
    
    'Закрываем ранее открытую книгу, из которой предварительно забрали все данные
    Workbooks(my_FileNameShort).Close SaveChanges:=False
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    
End Sub
vba
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    vikttur_Stop_RU_war_in_UA
    2021-12-31T06:40:09Z2021-12-31T06:40:09Z
    wb.Sheets("CAPEX").Range("a" & Rows.Count + 1 & ":an").PasteSpecial xlPasteValues
    

    这一行有三个错误。

    1. 未为列指定行an

    2. Rows.Count + 1- 工作表上的行数 + 1。不是数据行,而是总行数。自然,访问不存在的行(最后一行以下)会导致错误。

    3. 经常因为无知而踩到的耙子。Rows.Count- ACTIVE 工作表上的行数。错误示例:.xlsm 格式 ( Rows.Count= 1048576) 的书的活动工作表,但我们确定 .xls 格式的书的大小(工作表上有 65536 行)。

    4. 不是错误,而是多余的:不需要指定插入的大小,指示范围的左上角单元格就足够了。

    沿着代码。

    检查是否选择了一本书:

    If my_FileNameLong <> False Then
    

    如果未选中,则不会打开工作簿,但代码继续使用ActiveWorkbook,即 与ThisWorkbook. 你需要强制退出。

    在InputBox您需要指定工作表的名称。如果没有这样的名称 - 一个错误。之后,您需要检查工作表是否存在,或者在代码中静态指示工作表的名称(如果不需要选择)。

    Range("aw" & i & ":cj" & i)
    

    范围表示法在语法上是正确的,但可读性很差。相比:

    Range("AW" & i).Resize(1, 40)
    Cells(i,49).Resize(1, 40)
    

    Application.Calculation- 如果工作表上有很多计算可以在插入数据时开始,那么关闭重新计算是有意义的。

    循环通过线。访问工作表对象很慢。此外,在循环的每一步都有两个调用 - 复制时和粘贴时。而且,宏运行的时间越长。

    此任务不需要循环,复制/粘贴整个范围就足够了。

    如果需要循环(例如,根据条件选择每一行中的数据),那么使用数组,可以最大限度地减少对工作表的访问:1 - 将工作表中的数据放入数组中 2 - 将数据上传到床单。1 和 2 之间的所有内容都是在 RAM 中虚拟执行的。

    考虑到注释,代码可以写成以下版本:

    Sub GetTransactions_()
        Dim my_FileNameLong As String, ListName As String
        Dim FinalRow As Long
    
        my_FileNameLong = Application.GetOpenFilename(filefilter:="Excel Files,*.xl*;*.xm*")
        If my_FileNameLong = "False" Then Exit Sub
        
        Call OptionsEnable_Disable(False)
        
        With Workbooks.Open(Filename:=my_FileNameLong)
            ListName = InputBox("Введите имя листа, с которого берём информацию")
            If fCorrectNameSheet(ListName) = False Then Exit Sub
    
            With Worksheets(ListName)
                FinalRow = .Cells(.Rows.Count, 2).End(xlUp).Row
                .Range("AW4").Resize(FinalRow - 3, 40).Copy
            End With
            
            With ThisWorkbook.Worksheets("CAPEX")
                FinalRow = .Cells(.Rows.Count, 1).End(xlUp).Row
                .Cells(FinalRow + 1, 1).PasteSpecial xlPasteValues
            End With
        
            .Close
        End With
    
        Call OptionsEnable_Disable(True)
        MsgBox "OK", 64, ""
    End Sub
    
    Sub OptionsEnable_Disable(bFlag As Boolean)
        With Application
            .CutCopyMode = False
            .ScreenUpdating = bFlag
            .DisplayAlerts = bFlag
            
            If bFlag = False Then
                .Calculation = xlCalculateManual
            Else
                .Calculation = xlCalculationAutomatic
            End If
        End With
    End Sub
    
    Function fCorrectNameSheet(ListName As String) As Boolean
        Dim sht As Worksheet
        
        For Each sht In Worksheet
            If sht.Name = ListName Then
                fCorrectNameSheet = True
                Exit Function
            End If
        Next sht
    End Function
    
    • 0

相关问题

  • 计算 s = 1!+2!+ 3!+4!+5!+6![关闭]

  • column2中的值通过Excel列扩展(转置)为字符串,条件来自column1

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5