Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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 - Fatal编程技术网

VBA功能是否可以不使用剪贴板;使所有图纸仅具有值

VBA功能是否可以不使用剪贴板;使所有图纸仅具有值,vba,excel,Vba,Excel,我使用Excel 2010具有以下功能: Private Function MakeAllSheetsValuesOnly(targetBookName As String) If Excel.ActiveWorkbook.Name = Excel.ThisWorkbook.Name Then Else Excel.Workbooks(targetBookName).Activate Dim mySheet For Each mySheet

我使用Excel 2010具有以下功能:

Private Function MakeAllSheetsValuesOnly(targetBookName As String)

If Excel.ActiveWorkbook.Name = Excel.ThisWorkbook.Name Then
Else

        Excel.Workbooks(targetBookName).Activate

        Dim mySheet
        For Each mySheet In Excel.ActiveWorkbook.Sheets
                    With mySheet
                                With .Cells
                                            .Copy
                                            .PasteSpecial Excel.xlPasteValues
                                End With
                                .Select
                                .Range("A1").Select
                    End With
                    Excel.ActiveWindow.SmallScroll Down:=-200
                    Excel.Application.CutCopyMode = False
        Next mySheet
End If

End Function                        'MakeAllSheetsValuesOnly
它可以工作,但我不想依赖剪贴板。有没有其他方法可以使所有工作表仅具有值

刚刚找到了另一个与本主题相关的程序中使用的替代逻辑:

Dim rSource As Range
Dim rDest As Range

Set rSource = .Range("C5:BG" & .Range("B4").Value + 4)   
Set rDest = mySummaryBook.Sheets("Data_Measures").Cells(Rows.Count, 4).End(xlUp)(2, 1)
    With rSource
          Set rDest = rDest.Resize(.Rows.Count, .Columns.Count)
    End With
    rDest.Value = rSource.Value
Set rSource = Nothing
Set rDest = Nothing

基于Tim上面的答案(这似乎是最有效的方法),您可以清理代码,使其更快、更少地占用资源。见下文。虽然变化不大,但仍有助于处理问题。首先不需要函数。潜艇就行了。无需选择和激活这么多内容:

Private Sub MakeAllSheetsValuesOnly(targetBookName As String)

If ActiveWorkbook.Name <> ThisWorkbook.Name Then

        Dim wkb As Workbook
        Set wkb = Workbooks(targetBookName)

        With wkb
            Dim mySheet As Worksheet
            For Each mySheet In wkb.Worksheets
                mySheet.UsedRange.Value = mySheet.UsedRange.Value
            Next mySheet
        End With
End If

End Sub 'MakeAllSheetsValuesOnly
Private子文件仅生成AllSheetsValue(targetBookName作为字符串)
如果是ActiveWorkbook.Name ThisWorkbook.Name然后
将wkb设置为工作簿
Set wkb=工作簿(targetBookName)
与西九龙文娱艺术区
将我的工作表设置为工作表
对于wkb.工作表中的每个mySheet
mySheet.UsedRange.Value=mySheet.UsedRange.Value
下一页
以
如果结束
End Sub“仅制作所有表的值

可能是这样的:

With mySheet.UsedRange
    .Value = .Value
End With

这不需要函数

蒂姆已经给了你一个很好的方法。这是另一种方法

Sub Sample()
    MakeAllSheetsValuesOnly "Book2"
End Sub

Private Sub MakeAllSheetsValuesOnly(targetBookName As String)
    Dim mySheet As Worksheet
    Dim formulaCell As Range
    Dim aCell As Range

    Application.ScreenUpdating = False

    For Each mySheet In Workbooks(targetBookName).Sheets
        On Error Resume Next
        Set formulaCell = mySheet.Cells.SpecialCells(xlCellTypeFormulas)
        On Error GoTo 0

        If Not formulaCell Is Nothing Then
            For Each aCell In formulaCell
                aCell.Value = aCell.Value
            Next
        End If
    Next mySheet

    Application.ScreenUpdating = True
End Sub

您忘记更改“结束函数”;)快速提问@Siddharth Rout-虽然我知道你在这里做什么,因为你只在有公式的单元格中放置值,但你不认为只做一个usedrange.value=usedrange.value会比一次循环所有公式单元格更快吗,特别是在有大量公式单元格的床单上?@Scott:是的,你说得对。我已经写了代码,然后我看到了蒂姆的答案。我想,使用他建议的代码是不公平的:)他的方法肯定比我的快:)有道理。我可以理解:)@SiddharthRout我所在的分析师需要学习更多的sql,因为我可以处理的一些报告的计算单元超过20000个……尽管在较小的报告上,我喜欢这个想法。那真的是你的照片吗?我一直想说,我发现你的照片和丹尼尔·克雷格的照片有很多相似之处:)@Siddharth——我妻子会同意你的观点——尽管我一直认为她是在开玩笑@蒂姆·威廉姆斯:我肯定她不是在开玩笑:)@SiddharthRout……你喜欢我的个人资料照片吗?这绝对是我更好的一面@为什么UsedRange会忘记它的实际范围,所以当面积大小很重要时,通常的技巧是让它重新计算。对于Tim使用的覆盖值,此步骤是多余的