XL 2016 nommer et effectuer un calcul sur une plage de cellules dynamiquement

koutarel

XLDnaute Nouveau
Bonjour à tous

Je souhaiterais nommer mes plages de cellules (matrices de même taille) par le nom de cellule figurant sur la première colonne décalée par le même nombre de lignes de la matrice.
Je souhaiterais aussi sélectionner cette plage par son nom dans laquelle je fais appeller une fonction pour faire un calcul d'une manière itérative

je voudrait donc nommer la plage :
A3:O33 avec la première cellule (2ème ligne, première colonne) dont le contenu est " CD0 "
A35:O65 avec la deuxième cellule (34ème ligne, première colonne) dont le contenu est " CD1"
...
ainsi de suite
il y a pas de limite, à chaque fois on ajoute une matrice de même taille
Merci d'avance pour votre aide
 

Fichiers joints

frangy

XLDnaute Occasionnel
Bonjour,

Petit bémol pour le nommage des plages, tu ne peux pas donner un nom qui correspond à l'adresse d'une cellule (CD1 par exemple).
Dans l'exemple joint, la macro "Test" nomme les plages "CD1_", "CD2_", etc.

Cordialement.
 

Fichiers joints

zebanx

XLDnaute Accro
Bonjour Koutarel, Frangy, le forum

Un essai avec l'utilisation d'udf pour retrouver les références / spliter pour obtenir range de début et range de fin avec deux contraintes
- renseigner les tableaux dans l'ordre de présentation
- mettre un fin pour délimiter le dernier tableau

Par ailleurs, pas d'accord avec les noms donnés qui peuvent correspondre à des cellules (d'où conflit).
CD1 existe sur la feuille contrairement à CDname1

xl-ment
 

Fichiers joints

frangy

XLDnaute Occasionnel
Bonjour Koutarel, Frangy, le forum

Un essai avec l'utilisation d'udf pour retrouver les références / spliter pour obtenir range de début et range de fin avec deux contraintes
- renseigner les tableaux dans l'ordre de présentation
- mettre un fin pour délimiter le dernier tableau

Par ailleurs, pas d'accord avec les noms donnés qui peuvent correspondre à des cellules (d'où conflit).
CD1 existe sur la feuille contrairement à CDname1

xl-ment
Bonjour zebanx,
Il me semble que nous disons la même chose ... différemment.
Cordialement.
 

koutarel

XLDnaute Nouveau
Merci beaucoup pour votre aide, l'objectif de la macro c'est d'appliquer la macro d'interpolation bilinéaire sur une plage de cellule qu'on peut l'indiquer à partir du contenu de la cellule (Cellules se trouvant sur la première colonne)
C'est à dire à chaque fois j'entre comme paramètre le nom de la table (Cellule se trouvant sur la première colonne comme CD0, CD1,...,V1)
la macro va connaître la plage de cellules sur laquelle elle va interpoler.
Donc je souhaiterai avoir une macro:
- permettant d'identifier la plage de cellules à partir du nom de la table donné (nom de la table c'est le contenu en caractères des cellules en première colonne)
- Sélectionner cette plage de cellule (matrice)
- appeller la fonction d'interpolation bilinéaire

N.b: le nombre de plage de cellules n'est pas défini c'est dynamique
Ci-joint le fichier

Merci pour votre collaboration
 

Fichiers joints

frangy

XLDnaute Occasionnel
Bonsoir koutarel,

Tu ne dis pas si tu as regardé le travail qui a été fait.
Fichier du message # 2 : as-tu lancé la macro Test et vérifié les noms de plage créés ?

Cordialement.
 

koutarel

XLDnaute Nouveau
Bonsoir Frangy,

oui j'ai regardé le travail mais j'ai pas bien compris tout à l'heure. Maintenant, j'ai relancé la macro, oui ça fonctionne très bien, les noms des plages des cellules sont crées. Merci beaucoup

il me reste de sélectionner la plage concernant suivant le nom de la table pour faire appel à la fonction d'interpolation que je veux appliquer. Peux tu m'aider dans ce sens ?

La fonction d'interpolation je l'ai déjà appelée : interpolin(x,y,z,d,f,g) il faut juste l'appeller sur la plage adéquate au nom de la table correspondante.
 

frangy

XLDnaute Occasionnel
Je ne vois pas comment t’aider car je ne connais pas ta fonction d'interpolation.
A quoi correspondent les arguments x, y, z, d, f, g ?

Tu peux faire référence aux plages définies précédemment en utilisation la forme
range("CD0_"), range("CD1_"), etc.

sachant que :
range("CD0_") correspond à Feuil1!$A$3:$O$33,
range("CD1_") correspond à Feuil1!$A$35:$O$65,
etc.

J’espère que cela pourra t’aider.

Cordialement.
 

koutarel

XLDnaute Nouveau
bonsoir,

j'ai lancé le code mais il y a un débogage cette fois peut être ça dépend de la version excel comme il est montré ici :
1033219
1033220

et voilà ma fonction d'interpolation :

Public Function Interp2(xAxis As Range, yAxis As Range, zSurface As Range, xcoord As Double, ycoord As Double) As Double
' This function performs bilinear interpolation

Dim xArr() As Variant
xArr = xAxis.Value
Dim yArr() As Variant
yArr = yAxis.Value
Dim zArr() As Variant
zArr = zSurface.Value

'first find 4 neighbouring points
Dim nx As Long
Dim ny As Long
nx = UBound(xArr, 2)
ny = UBound(yArr, 1)

Dim lx As Single 'index of x coordinate of adjacent grid point to left of P
Dim ux As Single 'index of x coordinate of adjacent grid point to right of P

GetNeigbourIndices xArr, xcoord, lx, ux

Dim ly As Single 'index of y coordinate of adjacent grid point below P
Dim uy As Single 'index of y coordinate of adjacent grid point above P

GetNeigbourIndices yArr, ycoord, ly, uy

Dim fQ11, fQ21, fQ12, fQ22 As Double

fQ11 = zArr(lx, ly)
fQ21 = zArr(ux, ly)
fQ12 = zArr(lx, uy)
fQ22 = zArr(ux, uy)

'if point exactly found on a node do not interpolate
If ((lx = ux) And (ly = uy)) Then
Interp2 = fQ11
Exit Function
End If

Dim x, y, x1, x2, y1, y2 As Double

x = xcoord
y = ycoord

x1 = xArr(lx, 1)
x2 = xArr(ux, 1)
y1 = yArr(ly, 1)
y2 = yArr(uy, 1)

'if xcoord lies exactly on an xAxis node do linear interpolation
If (lx = ux) Then
Interp2 = fQ11 + (fQ12 - fQ11) * (y - y1) / (y2 - y1)
Exit Function
End If

'if ycoord lies exactly on an xAxis node do linear interpolation
If (ly = uy) Then
Interp2 = fQ11 + (fQ22 - fQ11) * (x - x1) / (x2 - x1)
Exit Function
End If

Dim fxy As Double

fxy = fQ11 * (x2 - x) * (y2 - y)
fxy = fxy + fQ21 * (x - x1) * (y2 - y)
fxy = fxy + fQ12 * (x2 - x) * (y - y1)
fxy = fxy + fQ22 * (x - x1) * (y - y1)
fxy = fxy / ((x2 - x1) * (y2 - y1))

Interp2 = fxy

End Function
Public Sub GetNeigbourIndices(inArr As Variant, x As Double, ByRef lowerX As Single, ByRef upperX As Single)

' It is required for the Iterp2 function

Dim n As Long
n = UBound(inArr, 1)

If n = 1 Then
'Transpose the arr
inArr = Application.Transpose(inArr)
n = UBound(inArr, 1)
End If

If x <= inArr(1, 1) Then
lowerX = 1
upperX = 1
ElseIf x >= inArr(n, 1) Then
lowerX = n
upperX = n
Else
Dim i As Long
For i = 2 To n
If x < inArr(i, 1) Then
lowerX = i - 1
upperX = i
Exit For
ElseIf x = inArr(i, 1) Then
lowerX = i
upperX = i
Exit For
End If
Next i
End If

End Sub

Donc le but c'est : appeller cette fonction sur la plage adéquate au nom de la table correspondante qui va être saisie par l'utilisateur ( par exemple la table que je vais saisir c'est V 30 donc ma macro va pointer sur la plage adéquate au nom de la table après il va appeller cette fonction Interp2(xAxis As Range, yAxis As Range, zSurface As Range, xcoord As Double, ycoord As Double).

Merci bcp pour ton aide
Cordialement
 

zebanx

XLDnaute Accro
Re-bonjour

As tu lu les messages 2 ou 3 stp ?

Une plage ne peut pas être nommée v30.
Il y a sûrement des noms qui correspondent à des références de cellules dans ton fichier non ? Check nécessaire.

@+
 

frangy

XLDnaute Occasionnel
Bonjour,
j'ai lancé le code mais il y a un débogage cette foi
J’ai du mal à comprendre.
Dans ton message # 7, tu me disais que le fonctionnement était correct et que les noms des plages des cellules étaient créés. Qu’est-ce qui a changé ?

Donc le but c'est : appeller cette fonction sur la plage adéquate au nom de la table correspondante qui va être saisie par l'utilisateur ( par exemple la table que je vais saisir c'est V 30 donc ma macro va pointer sur la plage adéquate au nom de la table après il va appeller cette fonction Interp2(xAxis As Range, yAxis As Range, zSurface As Range, xcoord As Double, ycoord As Double).
Tu montres bien ta fonction et ses 5 arguments mais cela ne m’indique pas le lien entre la plage "V30_" et ces arguments.

Cordialement.
 

koutarel

XLDnaute Nouveau
Bonjour,

Effectivement, ça marche pour toutes les matrices avec leurs noms de table sauf les matrices dont le nom commence par L et suivi par un numéro ( ça marche pour L_15, L.15, LM15, LL17 mais pas pour L15).

Pour l'interpolation, une fois je saisie le nom de la table, ma macro va parcourir toute la première colonne, une fois elle tombe sur le nom de la table que je saisie, elle va sélectionner cette plage sur laquelle elle va appeller cette fonction d'interpolation bilinéaire avec ses arguments:
-xAxis As Range : l'axe Horizontale de la matrice : les lignes de la matrices
-yAxis As Range : L'axe verticale de la matrice : les colonnes
-zSurface As Range : les coordonnees des 4 pts voisins qui l'entoure
-xcoord As Double : l'abscisse du pt cible sur lequel je vais interpoller par exemple ( x = 7m)
-ycoord As Double : l'ordonnée du pt cible surlequel je vais interpoller ( y = 200)

Remarque : - pour la première ligne, il y a des chiffres et des caractères comme suit : 6m, 12m, etc; quelle fct utiliser pour récupérer juste les chiffres et éliminer les lettres en cas général pour travailler juste avec des valeurs.
1033410
 

koutarel

XLDnaute Nouveau
Bonsoir,

Je souhaiterais comparer le nom de la table que je veux saisir dans une feuille à part par exemple "CD0_ " avec les noms des plages figurant dans la zone nom si il y a une coincidence je veux selectionner cette plage et appeller la fct d'interpolation ?
 

frangy

XLDnaute Occasionnel
Bonjour,
Effectivement, ça marche pour toutes les matrices avec leurs noms de table sauf les matrices dont le nom commence par L et suivi par un numéro (ça marche pour L_15, L.15, LM15, LL17 mais pas pour L15).
Aucune plage ne peut être nommée L15 puisque le programme ajoute systématiquement un caractère de soulignement au nom :
VB:
Plage.Name = CelD.Value & "_"
La plage prend donc le nom L15_

Pour l'interpolation, voici de quoi t’aider :
Avec la procédure, tu as créé la plage nommée "CD0_" (note bien encore qu’un underscore a été placé pour que le nom de plage soit valide).
Dans le classeur initial que tu as transmis, la plage "CD0_" correspond à A3: O33.

La plage xAxis correspondrait à B3: O3, c’est-à-dire la première ligne de la plage "CD0_" diminuée de la première cellule, soit :
Range("CD0_").rows(1).offset(,1).resize(,Range("CD0_").columns.count-1)

La plage yAxis correspondrait à A4: A33, c’est-à-dire la première colonne de la plage "CD0_" diminuée de la première cellule, soit :
Range("CD0_").columns(1).offset(1).resize(Range("CD0_").rows.count-1)

Pour les autres arguments, je te laisse voir.

pour la première ligne, il y a des chiffres et des caractères comme suit : 6m, 12m, etc; quelle fct utiliser pour récupérer juste les chiffres et éliminer les lettres en cas général pour travailler juste avec des valeurs.
Le plus simple serait de garder uniquement les valeurs numériques dans les cellules (6, 12, etc.).
Si tu as besoin de conserver l’affichage de l’unité, cela peut se faire avec le format nombre personnalisé : 0" m"

Cordialement.
 

koutarel

XLDnaute Nouveau
La plage xAxis correspondrait à B3: O3, c’est-à-dire la première ligne de la plage "CD0_" diminuée de la première cellule, soit :
Range("CD0_").rows(1).offset(,1).resize(,Range("CD0_").columns.count-1)

La plage yAxis correspondrait à A4: A33, c’est-à-dire la première colonne de la plage "CD0_" diminuée de la première cellule, soit :
Range("CD0_").columns(1).offset(1).resize(Range("CD0_").rows.count-1)
pour ces deux plages, pas de problème s'elles changent
mais pour zsurface c'est bel et bien la plage renommée par exemple CD0_ qui va entrer comme argument dans la fct interpolation.
et pour xcoord correspond à l'abscisse x du pt cible qui peut être situé sur la plage xaxis
et pou ycoord correspond à l'ordonnée y du pt cible qui peut être situé sur la plzge yaxis

Donc avant ça, s'il te plaît merci de voir

Merci beaucoup pour ton aide.
Peux-tu m'aider sur ça ? (Toujours la même situation mais avec une autre réflexion algorithmique)
XL 2016 comparer une cellule avec une colonne

Cordialement
 

Discussions similaires


Haut Bas