2017-04-09 2 views
0

J'ai un formulaire utilisateur qui déplace des objets (noms d'employés) sur une feuille de calcul afin que les gestionnaires puissent déplacer des employés dans un département différent (regroupement de lignes différent sur la feuille de calcul) si nécessaire. Le problème que j'ai rencontré est que lorsque je définis la ligne initiale qui appartient au nom de l'employé, puis déplacez cette ligne via Selection.Cut et Selection.Insert Shift: = xlDown, je ne peux plus appeler le nouvel emplacement de la ligne employee , car cela a changé et toutes les lignes de code qui suivent reconnaissent toujours la première ligne d'employé identifiée dans le code de l'userform.Modification variable (longue) dans le sous-programme non mis à jour

Dim UserRow As Long 
Dim UserMatrix As String 

Dim CCIRow As Long 
Dim CCIRange As String 
Dim CEMRow As Long 
Dim CEMRange As String 
Dim MANRow As Long 
Dim MANRange As String 

UserRow = Application.WorksheetFunction.Match(UserName, Range("A1:A300"), 0) 
UserMatrix = "B" & UserRow 

    CCIRow = Application.WorksheetFunction.Match("CCI/MDI", Range("A1:A300"), 0) + 1 
    Let CCIRange = "A" & CCIRow 
    CEMRow = Application.WorksheetFunction.Match("CE/Marketing", Range("A1:A300"), 0) + 1 
    Let CEMRange = "A" & CEMRow 
    MANRow = Application.WorksheetFunction.Match("Management", Range("A1:A300"), 0) + 1 
    Let MANRange = "A" & MANRow 
    OTHRow = Application.WorksheetFunction.Match("Other", Range("A1:A300"), 0) + 1 

Sheet3.Rows(UserRow).Select 
Selection.Cut 

If UserDept = "CCI/MDI" Then 
Sheet3.Rows(CCIRow).Select 
    Selection.Insert Shift:=xlDown 

    Sheet3.Range(UserMatrix).Select 
    Range(Selection, Selection.End(xlToRight)).Select 
    Selection.Clear                

    Sheet3.Range("MATRIX_ROW").Select 
    Selection.Copy                

    Sheet3.Range(UserMatrix).Select 
    Selection.PasteSpecial PASTE:=xlPasteAllUsingSourceTheme, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 

Sheet3.Range(CCIRange).Select 
    Range(ActiveCell, Cells(ActiveCell.End(xlDown).Row, ActiveCell.End(xlToRight).Column)).Sort _ 
     key1:=Range(CCIRange), order1:=xlAscending 
End If 

If UserDept = "CE/Marketing" Then 
Sheet3.Rows(CEMRow).Select 
    Selection.Insert Shift:=xlDown 

    Sheet3.Range(UserMatrix).Select 
    Range(Selection, Selection.End(xlToRight)).Select 
    Selection.Clear                

    Sheet3.Range("MATRIX_ROW").Select 
    Selection.Copy                

    Sheet3.Range(UserMatrix).Select 
    Selection.PasteSpecial PASTE:=xlPasteAllUsingSourceTheme, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 

Sheet3.Range(CEMRange).Select 
    Range(ActiveCell, Cells(ActiveCell.End(xlDown).Row, ActiveCell.End(xlToRight).Column)).Sort _ 
     key1:=Range(CEMRange), order1:=xlAscending 
End If 

If UserDept = "Management" Then 
Sheet3.Rows(MANRow).Select 
    Selection.Insert Shift:=xlDown 

    Sheet3.Range(UserMatrix).Select 
    Range(Selection, Selection.End(xlToRight)).Select 
    Selection.Clear 

    Sheet3.Range("MATRIX_ROW").Select 
    Selection.Copy 

    Sheet3.Range(UserMatrix).Select 
    ActiveCell.Offset(0, 1).Select 
    Selection.PasteSpecial PASTE:=xlPasteAllUsingSourceTheme, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 

Sheet3.Range(MANRange).Select 
    Range(ActiveCell, Cells(ActiveCell.End(xlDown).Row, ActiveCell.End(xlToRight).Column)).Sort _ 
     key1:=Range(MANRange), order1:=xlAscending 
End If 

Ma question: Est-il possible que je puisse mettre à jour la valeur d'une variable de dimension define (à savoir Dim) dans un sous-programme comme il change? Merci pour toute aide!

+0

MERCI DE VOTRE CONFIANCE! Réinitialiser la dimension après le déménagement était exactement ce qui a résolu mon problème! Il se passe beaucoup de choses dans l'application que j'ai développée, et ce petit snipet me causait tellement de frustration. Je vous dois quelques bières mon ami !! – markddelorme

+0

J'ai posté mon commentaire comme réponse, juste au cas où quelqu'un d'autre aurait le même problème à l'avenir. – YowE3K

Répondre

0

Si vous demandez pouvez vous changer la valeur de UserRow alors la réponse est "Oui". Tout ce que vous avez à faire est de lui attribuer la valeur du numéro de ligne de l'endroit où vous l'avez collé.

Je vais avoir du mal à comprendre le code avec tant de Select, ActiveCell et Selection bits mais il pourrait être quelque chose comme UserRow = CCIRow.

(Vous pouvez simplement le réinitialiser en utilisant votre nouveau déclaration UserRow = Application.WorksheetFunction.Match(UserName, Range("A1:A300"), 0) après le déménagement.)