2017-07-13 3 views
0

Excuses à l'avance, je n'ai pas d'exemple de code spécifique sur lequel travailler, c'est plus une question sur les options possibles pour effectuer une tâche avec un formulaire VBA.Structuration d'un formulaire VBA pour déplacer des lignes excel- lentes.

J'ai un ensemble de données dont j'ai besoin pour exécuter une procédure de vérification d'erreur. Une partie de cette procédure consiste à déplacer certaines lignes de données de la table d'origine vers l'une des deux autres tables. Je peux trouver ces lignes par la colonne de numéro de facture (une des colonnes 12ish sur les données). Le formulaire sur lequel je travaille comporte une configuration dans laquelle l'utilisateur saisit le numéro de facture dans une zone de texte et clique sur un bouton pour l'ajouter à une zone de liste. Le problème vient avec quoi faire ensuite avec le bouton "terminer/continuer".

Je peux très bien ajouter les numéros de facture de la zone de liste à un tableau, mais je ne sais pas comment procéder à partir d'ici. Un gars à mon travail a suggéré d'écrire le tableau sur une table et ensuite d'utiliser MATCH à côté pour obtenir la référence de la cellule et potentiellement tirer la ligne de cela, mais je ne peux pas faire fonctionner cela correctement; écrire le tableau dans une table m'évite, et puis obtenir les valeurs de la cellule dans un autre tableau ne semble pas que ça va bien fonctionner, car même alors, vous devez lire la ligne, puis en quelque sorte sélectionner la ligne du sous-jacent table, puis couper la ligne de la table ... etc etc

Je pensais que l'exécution d'un filtre sur la colonne de la facture des données en utilisant le tableau fonctionnerait, mais je ne sais pas comment écrire cela. Cela pourrait rendre la sélection de la gamme plus facile (juste .databodyrange? Peut ne pas fonctionner uniquement sur la zone filtrée ...).

De toute façon, avez-vous des idées ou connaissez-vous un exemple pour quelque chose de similaire?

Merci: 3

+0

La création d'un classeur entièrement nouveau contenant votre table de résultats fonctionne-t-elle pour vous? – Tehscript

+0

Avez-vous un code pour le moment? Si oui, vous devriez l'inclure dans votre question. –

+0

@Tehscript idéalement pas mais quelle est votre idée? Tim Williams, le seul code pertinent que j'ai encore est de créer le tableau et de faire tomber la zone de liste, qui n'a rien de spécial. –

Répondre

0

Donc, pour rechercher les valeurs que vous pouvez utiliser Range.Find, .VLookUp et .Match, la différence est la valeur de retour. Je ne sais pas pourquoi il a suggéré de l'écrire dans un tableau, mais vous pouvez simplement utiliser la valeur de la zone de texte. Vous ne pouvez pas rechercher plusieurs valeurs à la fois. Et avant de continuer, je vérifierais si un match existe.

Pour vous donner un exemple pour toutes les méthodes:

Private Sub txtInvoice_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) 

Dim txt As String: txt = txtInvoice.Text 
Dim sht As Worksheet 
Dim Result As Variant, ResultRng As Range, MReturn As Variant 

Set sht = Worksheets("Sheet1") 

'.Match 
If IsNumeric(txt) Then 
    Result = Application.Match(CLng(txt), sht.Range("A:A"), 0) 
Else 
    Result = Application.Match(txt, sht.Range("A:A"), 0) 
End If 
If Not IsError(Result) Then 
    MReturn = sht.Cells(Result, 3).Value 
    MsgBox MReturn 
Else 
    MsgBox ("Not Found!") 
    txtInvoice.SetFocus 
    Cancel = True 
End If 

'OR 

'.VLookUp 
If IsNumeric(txt) Then 
    Result = Application.VLookup(CLng(txt), sht.Range("A:C"), 3, False) 
Else 
    Result = Application.VLookup(txt, sht.Range("A:C"), 3, False) 
End If 
If Not IsError(Result) Then 
    MReturn = Result 
    MsgBox MReturn 
Else 
    MsgBox ("Not Found!") 
    txtInvoice.SetFocus 
    Cancel = True 
End If 

'OR 

'.Find 
Set ResultRng = sht.Range("A:A").Find(txt, LookAt:=xlWhole) 
If Not ResultRng Is Nothing Then 
    MReturn = sht.Cells(ResultRng.Row, 3).Value 
    MsgBox MReturn 
Else 
    MsgBox ("Not Found!") 
    txtInvoice.SetFocus 
    Cancel = True 
End If 
End Sub 

Ainsi, afin de l'essayer par vous-même, vous aurez besoin d'un Textbox appelé txtInvoice et un autre objet (comme un bouton, vous pouvez définir le focus sur). La feuille de calcul à apparier est Sheet1. La valeur est recherchée dans Col A et la valeur de retour dans Col C. Si vous mettez en surbrillance/basculez le focus sur l'autre objet en cliquant dessus, le sous-titre s'activera et essaiera de correspondre. Si ce n'est pas le cas, il émettra un message et refocalisera le Textbox.

Je recommande d'utiliser .Find, a le plus grand nombre d'options et le plus facile à utiliser. VLookUp et Match peuvent avoir des problèmes avec les chiffres, donc c'est pourquoi je les convertis en nombres réels, .Find n'a pas ce problème.

+0

Merci @UGP, c'est un bon endroit pour commencer. J'ai déjà le formulaire mis en place plus un formulaire secondaire s'il n'y a pas de correspondance (permet à l'utilisateur d'entrer les informations de facture manuellement) mais je manquais juste cette section du code.Le plan initial avec le tableau était de permettre à l'utilisateur de passer en revue les numéros de facture avant d'appuyer sur le bouton continuer, mais si cela ne fonctionne pas, le formulaire sera toujours bon. –