Skip x lignes de code en fonction d'une variable en VBA

J'ai un code qui permet de traiter les données à partir d'un PicoLog 1012 et l'enregistre dans un fichier excel. Il fonctionne bien, mais actuellement, il enregistre toujours 12 canaux de données. Cela permettra de ralentir si un grand nombre de données est nécessaire, donc, je tiens à permettre aux utilisateurs de saisir une valeur dans une cellule à définir le nombre de canaux, puis passez l'exécution de code inutile sur cette base.

Les pièces importantes sont:

Dim values() As Integer 'number of datapoints in the array. Equal to channels * number of datapoints required.
Dim numChannels As Integer
numChannels = Worksheets("Sheet1").Range("W5").value 'this allows the user to set the number of channels
Dim samplenum As Long
samplenum = Worksheets("Sheet1").Range("W3").value 'Reads number of samples desired per channel
nValues = samplenum * numChannels 
'The code apparently requires one of these lines per channel.
channels(0) = 1
channels(1) = 2
channels(2) = 3
channels(3) = 4
channels(4) = 5
channels(5) = 6
channels(6) = 7
channels(7) = 8
channels(8) = 9
channels(9) = 10
channels(10) = 11
channels(11) = 12
ReDim values(12 * Worksheets("Sheet1").Range("W3").value) 'allow a variable data array
Dim sampleInterval As Long
Dim microsecs_for_block As Long
Dim testlength As Integer
testlength = Worksheets("Sheet1").Range("W4").value
microsecs_for_block = testlength * 1000000
status = pl1000SetInterval(handle, microsecs_for_block, nValues, channels(0), numChannels)
status = pl1000Run(handle, nValues, 0)
'If there is a more efficient way to do what follows then I would LOVE to hear it. Currently logging begins long after I activate the macro.   
ready = 0
Do While ready = 0
status = pl1000Ready(handle, ready)
Loop
Cells(14, "P").value = "RECORDING COMPLETE" 'indicate readiness
' Get a block of W3 readings...
' we can call this routine repeatedly
' to get more blocks with the same settings
Dim triggerIndex As Long
Dim overflow As Integer
status = pl1000GetValues(handle, values(0), samplenum, overflow, triggerIndex)
' Copy the data into the spreadsheet
For i = 0 To samplenum - 1
1: Cells(i + 4, "A").value = adc_to_mv(values(numChannels * i + 0))
2: Cells(i + 4, "B").value = adc_to_mv(values(numChannels * i + 1))
3: Cells(i + 4, "C").value = adc_to_mv(values(numChannels * i + 2))
4: Cells(i + 4, "D").value = adc_to_mv(values(numChannels * i + 3))
5: Cells(i + 4, "E").value = adc_to_mv(values(numChannels * i + 4))
6: Cells(i + 4, "F").value = adc_to_mv(values(numChannels * i + 5))
7: Cells(i + 4, "G").value = adc_to_mv(values(numChannels * i + 6))
8: Cells(i + 4, "H").value = adc_to_mv(values(numChannels * i + 7))
9: Cells(i + 4, "I").value = adc_to_mv(values(numChannels * i + 8))
10: Cells(i + 4, "J").value = adc_to_mv(values(numChannels * i + 9))
11: Cells(i + 4, "K").value = adc_to_mv(values(numChannels * i + 10))
12: Cells(i + 4, "L").value = adc_to_mv(values(numChannels * i + 11))
Next i

Mon idée actuelle est d'écrire des 12 sous-marins pour cela et d'appeler chacun selon le nombre de canaux nécessaires, mais je suis sûr qu'il doit y avoir un moyen plus facile?

Est-il une sorte de "passer la commande" qui provoque des lignes à ignorer?

IF numChannels = 2
Then skip 3,4,5,6,7,8,9,10,11,12
Else
IF numChannels = 3
Then skip 4,5,6,7,8,9,10,11,12
Else
IF'.... et cetera
  • Le code est un peu difficile à suivre et il n'est pas reproductible, donc j'ai peut-être du mauvais côté du bâton, mais ma suggestion serait de faire de votre boucle d'arrêt de l'itération, le nombre de canaux afin de changer la ligne For i = 0 To samplenum - 1 à For i = 0 To Min(samplenum - 1, numChannels) qui sera de retour le plus faible de la samplenum ou numChannels valeurs.
  • Cela donne une erreur de compilation en disant: "Sub ou function non définie", et souligne "min". Pourrais-je appliquer ce même code pour le numéro de canal désignation de trop?
  • Toutes mes excuses, devrait être WorksheetFunction.min() et oui, vous pouvez.
  • Cela renvoie numChannels+1 lignes de données, mais les données semblent être répété 2 séries de 6 colonnes, donc retour 12 canaux de données à nouveau.
  • Sans reproductible et code visible, je crains que je ne peux pas vous aider efficacement. Dropbox n'est pas l'ami de travail des mandataires.
  • Désolé, j'ai posté un lien dropbox dans le commentaire original maintenant, j'ai oublié de le faire avant!
  • Je ne peux pas accéder à dropbox dans le travail. Si vous avez besoin de plus de soutien sur cette macro, puis super-Utilisateur pourrait être une bonne idée ou la ozgrid forum - ici c'est moins interactif.
  • Merci, je vais vérifier ça.

InformationsquelleAutor Cassiopeia | 2013-12-03