VBA代码在调用时未正确执行

VBA代码在调用时未正确执行,vba,excel,duplicates,call,Vba,Excel,Duplicates,Call,大家好,我希望你们能帮忙。我有一段代码,见下文 我试图实现的是,用户打开一个Excel工作表,其中包含一个命令按钮和说明。 单击命令按钮后,将打开一个对话框,允许用户选择另一个excel工作表,选择该excel工作表后,将触发另一段代码(应)并合并重复项,修改开始日期和结束日期,工作表将保持打开状态,无重复项且日期正确 这段代码 Public Sub ConsolidateDupes() 在原始工作表上,当它自己运行时,它可以完美地工作,但是当我试图用命令按钮调用它时,它不能正常工作。没有出现

大家好,我希望你们能帮忙。我有一段代码,见下文

我试图实现的是,用户打开一个Excel工作表,其中包含一个命令按钮和说明。 单击命令按钮后,将打开一个对话框,允许用户选择另一个excel工作表,选择该excel工作表后,将触发另一段代码(应)并合并重复项,修改开始日期和结束日期,工作表将保持打开状态,无重复项且日期正确

这段代码

Public Sub ConsolidateDupes()
在原始工作表上,当它自己运行时,它可以完美地工作,但是当我试图用命令按钮调用它时,它不能正常工作。没有出现错误,只是没有删除所有可能的重复项,也没有将日期设置为最早的开始日期和最晚的结束日期

我添加了一些图片以便于解释 图1

带命令按钮的Excel工作表

Pic 2待选择的图纸处于原始状态,具有重复件和多个开始和结束日期

代码已由该工作表上的itslef运行后的所选工作表

当使用命令按钮时调用所选图纸

正如您希望看到的那样,重复的数据被保留了下来,并且日期没有被处理到最早的开始日期和最晚的结束日期

正如我所说,当代码在工作表上单独运行时,它可以完美地工作,但是当调用它时,它会留下重复的代码,并且不会在开始和结束日期工作

这是我的代码,非常感谢您的帮助

代码

子打开工作簿对话框()
将my_文件名设置为变体
MsgBox“选择丹麦文件”您可以删除以下内容:

    Rows(r).Delete
并写下以下内容:

    wks.Rows(r).Delete
编辑: 试试这个: (非常脏的解决方案,但应该有效)

子打开工作簿对话框()
将strFileName设置为字符串
将wkb设置为工作簿
将工作作为工作表
最后一排一样长
变暗,变长
MsgBox“选择丹麦文件”wks.Cells(r-1,9)然后
wks.Cells(r-1,9)=wks.Cells(r,9)
如果结束
'删除重复项
行(r)。删除
如果结束
下一个
端接头
但是,问题是它不起作用,因为您没有将my_文件名传递给ConsolidateDupes过程。因此,这个过程是用按钮在文件中执行的,在那里有点没有意义

您好,所以需要进行一些更改才能使其正常工作,下面是有效的代码,我希望它能帮助VBA'r的同事:-)

子打开工作簿对话框()
将strFileName设置为字符串
将wkb设置为工作簿
将工作作为工作表
最后一排一样长
变暗,变长

MsgBox“选择丹麦文件”'感谢您抽出时间回复Vityata。我做了改变,但运气不好。很遗憾,它无法工作。请保存工作表,关闭它,打开它,然后重试。它应该能用。Open是用M写的。再试一次:)哦,你帮了我很大的忙,我希望有一天能把它全部付清。我已经删除了图片,谢谢你的提醒。好的建议。很高兴知道-一旦你变得更有经验,你可以再次查看代码,删除
ActiveWorkbook
部分,直接设置工作簿。Activeworkbook、activesheet、activecell等在VBA中被认为是不好的做法。但就其有效性而言,这是可以的。
    wks.Rows(r).Delete
Sub Open_Workbook_Dialog()


    Dim strFileName     As string
    dim wkb             as workbook
    Dim wks             As Worksheet
    Dim lastRow         As Long
    Dim r               As Long

    MsgBox "Select Denmark File" '<--| txt box for prompt to pick a file

        strFileName = Application.GetOpenFilename(FileFilter:="Excel Files,*.xl*;*.xm*") '<--| Opens the file window to allow selection

    set wkb = Application.Workbooks.Open(strFileName)
    Set wks = wkb.Sheet1
    lastRow = wks.UsedRange.Rows.Count

    For r = lastRow To 3 Step -1
        ' Identify Duplicate
        If wks.Cells(r, 1) = wks.Cells(r - 1, 1) _
        And wks.Cells(r, 2) = wks.Cells(r - 1, 2) _
        And wks.Cells(r, 3) = wks.Cells(r - 1, 3) _
        And wks.Cells(r, 4) = wks.Cells(r - 1, 4) _
        And wks.Cells(r, 5) = wks.Cells(r - 1, 5) _
        And wks.Cells(r, 6) = wks.Cells(r - 1, 6) _
        And wks.Cells(r, 7) = wks.Cells(r - 1, 7) Then
            ' Update Start Date on Previous Row
            If wks.Cells(r, 8) < wks.Cells(r - 1, 8) Then
                wks.Cells(r - 1, 8) = wks.Cells(r, 8)
            End If
            ' Update End Date on Previous Row
            If wks.Cells(r, 9) > wks.Cells(r - 1, 9) Then
                wks.Cells(r - 1, 9) = wks.Cells(r, 9)
            End If
            ' Delete Duplicate
            Rows(r).Delete
        End If
    Next
End Sub
   Sub Open_Workbook_Dialog()


    Dim strFileName     As String
    Dim wkb             As Workbook
    Dim wks             As Worksheet
    Dim LastRow         As Long
    Dim r               As Long

    MsgBox "Select Denmark File" '<--| txt box for prompt to pick a file

        strFileName = Application.GetOpenFilename(FileFilter:="Excel Files,*.xl*;*.xm*") '<--| Opens the file window to allow selection

    Set wkb = Application.Workbooks.Open(strFileName)
    Set wks = ActiveWorkbook.Sheets(1)
    LastRow = wks.UsedRange.Rows.Count

    ' Sort the B Column Alphabetically
    With ActiveWorkbook.Sheets(1)

        Dim LastRow2 As Long
        LastRow2 = .Cells(Rows.Count, 1).End(xlUp).Row
        Dim LastCol As Long
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        With ActiveWorkbook.Worksheets("Sheet1").Sort
            .SortFields.Clear
            .SortFields.Add Key:=Range(Cells(2, 2), Cells(LastRow, 2)), _
                            SortOn:=xlSortOnValues, _
                            Order:=xlAscending, _
                            DataOption:=xlSortNormal
            .SetRange Range(Cells(2, 1), Cells(LastRow, LastCol))
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply

        End With

    End With

    For r = LastRow To 3 Step -1
        ' Identify Duplicate
        If wks.Cells(r, 1) = wks.Cells(r - 1, 1) _
        And wks.Cells(r, 2) = wks.Cells(r - 1, 2) _
        And wks.Cells(r, 3) = wks.Cells(r - 1, 3) _
        And wks.Cells(r, 4) = wks.Cells(r - 1, 4) _
        And wks.Cells(r, 5) = wks.Cells(r - 1, 5) _
        And wks.Cells(r, 6) = wks.Cells(r - 1, 6) _
        And wks.Cells(r, 7) = wks.Cells(r - 1, 7) Then
           ' Update Start Date on Previous Row
        If CDate(wks.Cells(r, 8)) < CDate(wks.Cells(r - 1, 8)) Then
         wks.Cells(r - 1, 8) = wks.Cells(r, 8)
        End If
        ' Update End Date on Previous Row
        If CDate(wks.Cells(r, 9)) > CDate(wks.Cells(r - 1, 9)) Then
        wks.Cells(r - 1, 9) = wks.Cells(r, 9)
        End If
            ' Delete Duplicate
            Rows(r).Delete
        End If
    Next
End Sub