2016-11-23 2 views
1

Je dois ensembles moyenne de 3 colonnes.Automatiser moyenne ensembles de colonnes dans Excel

Exemple:

Blood_Patient1_0_R1, Blood_Patient1_0_R2, Blood_Patient1_0_R3

Il moyenne est dans une nouvelle colonne Blood_Patient1_0

De même, Blood_Patient1_3_5_R1, Blood_Patient1_3_5_R2, Blood_Patient1_3_5_R3

La moyenne est dans une nouvelle colonne Blood_Patient1_3_5

Ce processus est répété pour 8 ensembles de colonnes de ce type.

Actuellement, je suis en moyenne de par la formule: IF(ISERROR(AVERAGE(B7:D7)),"",AVERAGE(B7:D7)) et auto-remplissage 21.000 lignes et plus.

Comme il existe un modèle dans têtes de colonne, je pensais à automatiser le processus.

C'est ce que j'ai pensé jusqu'à présent en termes d'algorithme:

  • 0, 3_5, 6_25 sont des valeurs de temps en-têtes de colonnes.
  • à chaque instant, il y a trois répétitions R1, R2, R3 en tant que partie d'en-têtes de colonne

pour réseau time [de 3.5h, 6.25h, 9.5h, 11.5h, 16.5h, 25h , 49h et 156h ]

créer une nouvelle colonne

pour les lignes de 2-21458

moyenne sur replicates de R1 à R3 ci-dessus en utilisant formul un

Je ne sais pas comment écrire dans Excel. Toute aide serait appréciée.

+0

Qu'est-ce que vous cherchez à automatiser? Devez-vous régulièrement importer de nouvelles données dans la feuille de calcul, puis ajouter les colonnes moyennes? si c'est le cas, je recommanderais simplement de mettre en forme une plage sous la forme d'une table avec une ligne, dont la dernière colonne contient la formule moyenne. Lorsque vous collez vos données, la formule est automatiquement appliquée à l'intégralité du jeu de données. – MJV

+0

@MJV .... Je souhaite écrire un script qui recherche la colonne Blood_Patient1_T_RX. et pour chaque instant T = [3_5, 6_25, 9_5, 11_5, 16_5, 25, 49, et 156] il fait la moyenne de la colonne RX = [R1, R2, R3] pour chaque rangée (nombre total de lignes = 21456). – urwaCFC

Répondre

0

Donnez un aller.

Cette solution suppose que vous disposez d'un ensemble de données en continu, à savoir, pas d'espace entre les colonnes que vous souhaitez effectuer la recherche.

Tout d'abord, vous devrez inclure cette fonction. Collez-le dans le même module que le sous-programme. Le but de cette fonction est de permettre la comparaison de la chaîne dans chaque en-tête avec un tableau de sous-chaînes, par opposition à la sous-chaîne unique autorisée par la fonction InStr.

Function Time_Search(strCheck As String, ParamArray anyOf()) As Boolean 

Dim item As Long 

For item = 0 To UBound(anyOf) 

    If InStr(1, strCheck, anyOf(item)) <> 0 Then 

     Time_Search = True 

     Exit Function 

    End If 

Next 

End Function 

Ensuite, collez dans ce sous-programme. J'ai assumé que l'ensemble de données commence à la cellule A1. En outre, j'ai permis une gamme dynamique, si le nombre de colonnes ou de lignes change jamais.

Sub Insert_Average_Columns() 

Dim HeaderRange As Range 
Dim LastRow As Long 
Dim c As Range 

Set HeaderRange = Range(Range("A1"), Range("A1").End(xlToRight)) 
LastRow = Range("A" & Rows.Count).End(xlUp).Row 

For Each c In HeaderRange.Cells 

If Right(c.Value, 2) = "R3" Then 

    If Time_Search(c.Value, "3_5", "6_25", "9_5", "11_5", "16_5", "25", "49", "156") Then 

     c.Offset(0, 1).EntireColumn.Insert 
     c.Offset(0, 1) = "Average of " & Left(c.Value, Len(c.Value) - 3) 
     c.Offset(1, 1).FormulaR1C1 = "=IFERROR(AVERAGE(RC[-3]:RC[-1]),"""")" 
     c.Offset(1, 1).AutoFill Range(c.Offset(1, 1).Address, Cells(LastRow, c.Offset(1, 1).Column)) 

    End If 

End If 

Next c 

End Sub 

Il y a un problème avec vos données. Si vous voulez que la procédure insère une colonne moyenne pour T = 25, alors elle le fera pour toutes les colonnes où T contient la chaîne "25". S'il y a T = 8.25, 10.25, 15.25, etc, ceux-ci auront tous des moyennes appliquées. Le seul moyen de contourner cela serait d'inclure plus de la chaîne de titre dans le tableau de paramètres, mais je suppose que vous aurez affaire à un variable Blood_Patient ID, ce qui n'est probablement pas une option.