2017-04-09 51 views
0

我有一个用户窗体在工作表上移动对象(员工姓名),以便管理人员可以将员工移动到不同的部门(工作表上的不同行组)。我遇到的问题是,当我定义属于员工姓名的初始行,然后通过Selection.Cut和Selection.Insert Shift:= xlDown移动该行时,我无法再调用员工行的新位置,因为这已经改变,任何后续的代码行仍然可以识别userform代码中标识的初始雇员行。定义变量(长)在子程序内更改未更新

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 

我的问题:有没有我可以在子程序中更新定义维度变量(即点心)的价值,因为它改变了什么办法?谢谢你的帮助!

+0

THANK YOU!移动后重置维度正是解决了我的问题!在我开发的应用程序中有很多事情发生,而这个小snipet让我非常沮丧。我欠你一杯啤酒,我的朋友! – markddelorme

+0

我已经发布了我的评论作为答案,以防其他人在将来遇到同样的问题。 – YowE3K

回答

0

如果您问的是否可以更改UserRow的值,那么答案是“是”。 您只需为其分配粘贴位置的行号值即可。

我很难理解代码有这么多Select,ActiveCellSelection位,但它可能类似于UserRow = CCIRow

(或者,你可以通过在移动后再次使用UserRow = Application.WorksheetFunction.Match(UserName, Range("A1:A300"), 0)声明重置。)