VBA功能是否可以不使用剪贴板;使所有图纸仅具有值
我使用Excel 2010具有以下功能: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
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使用的覆盖值,此步骤是多余的