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
加速包含VBA代码的Excel文件_Excel_Vba_Function_Merge_Cell - Fatal编程技术网

加速包含VBA代码的Excel文件

加速包含VBA代码的Excel文件,excel,vba,function,merge,cell,Excel,Vba,Function,Merge,Cell,我在vba中使用此函数: Function mergedText(rngMergedCell As Range) If rngMergedCell.MergeCells = True Then mergedText = rngMergedCell.MergeArea(1, 1) Else mergedText = rngMergedCell End If End Function 函数允许我的公式读取合并单元格的值。 它工作得很好。

我在vba中使用此函数:

Function mergedText(rngMergedCell As Range)

    If rngMergedCell.MergeCells = True Then
        mergedText = rngMergedCell.MergeArea(1, 1)
    Else
        mergedText = rngMergedCell
    End If 

End Function
函数允许我的公式读取合并单元格的值。 它工作得很好。然而,excel变得如此缓慢

如何加快excel的速度?请给我一步一步的答案。我不擅长vba


谢谢

这段代码应该可以完成这项工作,尽管它不是一个函数,您每次需要它时只需运行一次,它将是即时交付的

Option Explicit   

Public Sub MainMethod()

 Application.Calculation = xlCalculationManual
 Application.ScreenUpdating = False
 Application.DisplayStatusBar = False

    MySubMethod() ' your func

  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True
  Application.DisplayStatusBar = True

End Sub 
Option Explicit
Sub Test()

    With ThisWorkbook.Sheets("YourSheet") 'change YourSheet for your actual sheet name
        Dim LastRow As Long
        LastRow = .Cells(.Rows.Count, "I").End(xlUp).Row 'I suppose your last row with actual data will be on column I

        Dim arr As Variant
        arr = .Range("H2:K" & LastRow).Value 'I'm assuming you have headers.

        Dim ValueA As String
        Dim i As Long
        For i = 2 To UBound(arr)
            If arr(i, 1) <> vbNullString Then ValueA = arr(i, 1) 'this will always get the last value from column A not empty cell
            If arr(i, 2) <> 0 Then arr(i, 3) = ValueA & "-" & arr(i, 2) 'if cell I <> 0 then concatenate the values
        Next i

        .Range("H2:K" & LastRow).Value = arr
    End With

End Sub
选项显式
子测试()
使用ThisWorkbook.Sheets(“YourSheet”)更改工作表的实际工作表名称
最后一排一样长
LastRow=.Cells(.Rows.Count,“I”).End(xlUp).Row'我想您的最后一行实际数据将位于第I列
作为变体的Dim-arr
arr=.Range(“H2:K”&LastRow).Value'我假设您有标题。
将值作为字符串
我想我会坚持多久
对于i=2至UBound(arr)
如果arr(i,1)vbNullString,则ValueA=arr(i,1)’这将始终从非空单元格的列中获取最后一个值
如果arr(i,2)0,则arr(i,3)=ValueA&“-”&arr(i,2)”如果单元格i 0,则连接这些值
接下来我
.Range(“H2:K”和LastRow)。值=arr
以
端接头

这里有一种从垂直合并的单元格(即仅1列)中检索值的方法,不使用VBA

首先,警告-这将跳过列中的所有空白单元格,以查找第一个包含与目标单元格位于同一行或以上的数据的单元格。因此,它不会提取“空白”数据,也不关心单元格是否实际合并

$A1
是您的目标单元格
$A$1:$A1
将是列A中当前行中或其上方的单元格。向下拖动公式时,该单元格将展开(即,在第9行,它将是
$A$1:$A9

SUMPRODUCT
将找到有数据(
LEN($A1)>0
)的
MAX
行。然后
索引使用该行返回值

这将在数组公式中显示,因此在中键入公式后,需要使用Ctrl+Shift+Enter

如果中或以上没有数据,则公式将引用顶部单元格,并返回0(请参阅)。我们可以使用
计数a
返回一个空白(
),以查看是否有任何数据:

=IF(COUNTA($A$1:$A1)<1, "", INDEX($A$1:$A1, SUMPRODUCT(MAX(ROW($A$1:$A1)*--(LEN($A$1:$A1)>0))),1))
=IF(COUNTA($A$1:$A1)0)),1)

您的函数正在尝试从合并单元格中检索文本。为什么?您可以只指向单元格,也可以这样做。@Damian该函数从合并区域中的任何单元格中获取对合并区域左上角单元格的引用,并返回其值。只有MR的TL单元才有价值。是的@克里斯·内尔森是对的。但如果你有更好的方法,请告诉我。谢谢@达米安。但A中的合并单元格并不总是相同的。大约四排,大约五排。如果我使用C2=If(A2=“”;A1&B2;A2&B2),则每次合并单元格中的行数都必须调整公式differ@inversebow编辑你的Q以包含所有相关的infoHello,只需在代码前添加代码(在主方法的开头),在代码后添加代码(在主方法的结尾),而不是在注释中添加I fo,没别的了。。让我知道它是否有助于加速它返回“无效的外部程序”。您知道为什么吗?@inversebow您是否试图将工作表中的函数用作自定义项(“用户定义函数”),而不是宏中的函数?这对你能做什么和不能做什么有着巨大的影响,应该在问题中提到。。这是模块1中的全部代码。vb@PeterKsenak,返回语法错误。知道为什么吗<代码>Option Explicit Public Sub MainMethod()Application.Calculation=xlCalculationManual Application.ScreenUpdate=False Application.DisplayStatusBar=False MySubMethod()函数mergedText(rngMergedCell作为范围)如果rngMergedCell.MergeCells=True,则mergedText=rngMergedCell.MergeArea(1,1)Else mergedText=rngMergedCell End If Application.Calculation=XLCalculation Automatic Application.ScreenUpdate=True Application.DisplayStatusBar=True End Sub
感谢您的否决票,但我希望您能对我的答案发表评论。我没有否决票,但是你能解释为什么你认为这会解决OP的问题吗?他想将第1列和第2列的值连接到第3列,如果:列A为空,则必须获得之前填充的值。列2必须为0。这段代码就是这么做的。这可以用来检索日期吗?@inversebow是的,这将适用于任何非空值。尝试在空白工作表的A列中创建几个具有不同值的合并单元格,并测试代码。当单元格为空时,该列返回“0”。你知道为什么吗?@inversebow如果在同一行或以上没有数据,它将从列的顶部返回值。如果公式引用空白单元格,它将返回0-这是Excel的已知功能。你可以通过一个
CountA
-我会更新答案
=IF(COUNTA($A$1:$A1)<1, "", INDEX($A$1:$A1, SUMPRODUCT(MAX(ROW($A$1:$A1)*--(LEN($A$1:$A1)>0))),1))