首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >非活动工作表中Excel中UDF更新中的错误

非活动工作表中Excel中UDF更新中的错误
EN

Stack Overflow用户
提问于 2020-06-10 10:47:07
回答 1查看 31关注 0票数 0

我已经创建了一些UDF来自动化一些微积分我和一些同事经常使用。为了简单起见,我粘贴了我遇到问题的MWE,我的实际代码更长,但输入相同,一个单元格的范围,其中一个维度等于一个(所以一行或一列)

代码语言:javascript
运行
复制
Public Function Test(Donnees As Range)

Dim Nombre_Cellules, Temp As Double
Dim Format_Donnees As String

Temp = 0


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'                                                                                   '
'       Parametres utiles generaux                                                  '
'                                                                                   '
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Nb_Lignes = Donnees.Rows.Count
Nb_Colonnes = Donnees.Columns.Count
Premiere_Ligne = Donnees.Row
Premiere_Colonne = Donnees.Column
Derniere_Ligne = Donnees.Row + Nb_Lignes - 1
Derniere_Colonne = Donnees.Column + Nb_Colonnes - 1



'On definit la frequence et la taille associee
If Nb_Lignes = 1 Then
    Format_Donnees = "Colonnes"
    Nombre_Cellules = Nb_Colonnes
End If
If Nb_Colonnes = 1 Then
    Format_Donnees = "Lignes"
    Nombre_Cellules = Nb_Lignes
End If


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'                                                                                   '
'       Verifications des parametres et messages d'erreurs                          '
'                                                                                   '
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'On verifie que la plage renseignée est soit sur une seule ligne soit sur une seule colonne
If (Nb_Lignes <> 1 And Nb_Colonnes <> 1) Then
        MsgBox _
            "La plage de données considérée est incorrecte, il ne peut s'agir que " & vbNewLine & _
            Chr(149) & " de données sur une seule ligne ou " & vbNewLine & _
            Chr(149) & " de données sur une seule colonne" _
            , , "Parametres incorrects"
        Test = CVErr(xlErrRef)
        Exit Function
End If


'On verifie que toute la période qui sert au calcul contient bien des valeurs numériques et ne contient pas de valeurs vides
If Format_Donnees = "Lignes" Then
    For i = 0 To Nombre_Cellules - 1
        If Not IsNumeric(Cells(Premiere_Ligne + i, Premiere_Colonne).Value) Then
            MsgBox _
            "La plage de donnée considérée est incorrecte" & vbNewLine & _
            "Toutes les cellules nécessaires au calcul dans la colonne ne sont pas numériques" _
            , , "Parametres incorrects"
            Test = CVErr(xlErrRef)
            Exit Function
        End If
        If (Cells(Premiere_Ligne + i, Premiere_Colonne).Value = "") Then
            MsgBox _
            "La plage de donnée considérée est incorrecte" & vbNewLine & _
            "Une cellule de la colonne considérée est vide et semble avoir une valeur manquante" _
            , , "Parametres incorrects"
            Test = CVErr(xlErrRef)
            Exit Function
        End If
    Next
End If
If Format_Donnees = "Colonnes" Then
    For i = 0 To Nombre_Cellules - 1
        If Not IsNumeric(Cells(Premiere_Ligne, Premiere_Colonne + i).Value) Then
            MsgBox _
            "La plage de donnée considérée est incorrecte" & vbNewLine & _
            "Toutes les cellules nécessaires au calcul dans la ligne ne sont pas numériques" _
            , , "Parametres incorrects"
            Test = CVErr(xlErrRef)
            Exit Function
        End If
        If (Cells(Premiere_Ligne, Premiere_Colonne + i).Value = "") Then
            MsgBox _
            "La plage de donnée considérée est incorrecte" & vbNewLine & _
            "Une cellule de la ligne considérée est vide et semble avoir une valeur manquante" _
            , , "Parametres incorrects"
            Test = CVErr(xlErrRef)
            Exit Function
        End If
    Next
End If


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'                                                                                   '
'                           Calculs a proprement parler                             '
'                                                                                   '
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


If Format_Donnees = "Lignes" Then
    For i = 0 To Nombre_Cellules - 1
        Temp = Temp + Cells(Premiere_Ligne + i, Premiere_Colonne).Value
    Next
End If
If Format_Donnees = "Colonnes" Then
    For i = 0 To Nombre_Cellules - 1
        Temp = Temp + Cells(Premiere_Ligne, Premiere_Colonne + i).Value
    Next
End If

Test = Temp
End Function

因此,由于我将不是这个函数的唯一用户,所以我尝试包含了几个检查和错误消息。一是检查所选范围是否有任何空值和任何非数字值。

现在,我的函数开始工作了(至少它们计算出了我想要它们做的事情),但是在它们的更新方式上我遇到了一些问题。请注意,我对用户首选项进行了推送,以便在输入中传递的范围中包含所有使用的值。

我能够用这段代码再现的问题之一是,如果我在一个工作簿的几个工作表上使用这个函数(因此在Test()中使用一个worksheet1,在worksheet2中使用一个Test(),并且出于一个原因试图更新整个工作簿(例如通过Ctrl + alt + shift + F9),那么我将在一个非活动工作表中得到一个已设置的警告("Une cellule de la ligne considérée est vide et semble avoir une valeur manquante")。

有人能解释一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-10 12:22:15

您使用的单元格()没有工作表限定条件。这意味着它指的是活动表碰巧是什么。因此,除非对UDF的所有调用都在当前活动的工作表上,否则它将无法正常工作。

您需要将其更改为Donnees.Cells( ),并将单元格索引更改为引用Donnees中的单元而不是整个工作表中的单元格。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62301698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档