Vba 作用 '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ' '此代码刷新活动工作表中的所有链接。 ' '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 子刷新所有链接() '最小化运行时 Application.ScreenUpdating=False Application.DisplayAlerts=False '初始化变量 Dim summarywb作为工作簿 '设置初始值 Set summarywb=此工作簿 '刷新所有链接数据 summarywb.ActiveSheet.Activate summarywb.UpdateLink名称:=summarywb.LinkSources '重新显示 Application.ScreenUpdating=True Application.DisplayAlerts=True 端接头 '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ' '此代码将突出显示的数据行从“当前”选项卡移动到“存档”选项卡。 ' '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 副档案数据() '最小化运行时 Application.ScreenUpdating=False Application.DisplayAlerts=False '初始化变量 Dim summarywb作为工作簿 最后一排一样长 昏暗的纽罗 '设置初始值 Set summarywb=工作簿(“Project Status Summary.xlsm”) "要求确认 如果MsgBox(“归档突出显示的作业”),vbYesNo,“确认”)=vbNo,则 '重新显示 Application.ScreenUpdating=True Application.DisplayAlerts=True '中止消息 MsgBox“未存档的作业。” 出口接头 如果结束 '查找存档工作表上最后一个非空行 工作表(“存档”)。激活 LastRow=summarywb.Sheets(“存档”).Cells.Find(内容:=“*”,后面:=Range(“A1”),LookIn:=xlFormulas,LookAt:=xlPart,SearchOrder:=xlByRows,SearchDirection:=xlPrevious,MatchCase:=False)。行 '为新行指定行号 NewRow=LastRow+1 '将数据从当前选项卡复制并粘贴到存档选项卡 工作表(“当前”)。激活 选择,复制 工作表(“存档”)。激活 范围(“A”&新行)。选择 Selection.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,skipblank:=Flase,转置:=False ''显示确认消息 MsgBox(“已存档的作业”) '重新显示 Application.ScreenUpdating=True Application.DisplayAlerts=True 端接头

Vba 作用 '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ' '此代码刷新活动工作表中的所有链接。 ' '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 子刷新所有链接() '最小化运行时 Application.ScreenUpdating=False Application.DisplayAlerts=False '初始化变量 Dim summarywb作为工作簿 '设置初始值 Set summarywb=此工作簿 '刷新所有链接数据 summarywb.ActiveSheet.Activate summarywb.UpdateLink名称:=summarywb.LinkSources '重新显示 Application.ScreenUpdating=True Application.DisplayAlerts=True 端接头 '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ' '此代码将突出显示的数据行从“当前”选项卡移动到“存档”选项卡。 ' '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 副档案数据() '最小化运行时 Application.ScreenUpdating=False Application.DisplayAlerts=False '初始化变量 Dim summarywb作为工作簿 最后一排一样长 昏暗的纽罗 '设置初始值 Set summarywb=工作簿(“Project Status Summary.xlsm”) "要求确认 如果MsgBox(“归档突出显示的作业”),vbYesNo,“确认”)=vbNo,则 '重新显示 Application.ScreenUpdating=True Application.DisplayAlerts=True '中止消息 MsgBox“未存档的作业。” 出口接头 如果结束 '查找存档工作表上最后一个非空行 工作表(“存档”)。激活 LastRow=summarywb.Sheets(“存档”).Cells.Find(内容:=“*”,后面:=Range(“A1”),LookIn:=xlFormulas,LookAt:=xlPart,SearchOrder:=xlByRows,SearchDirection:=xlPrevious,MatchCase:=False)。行 '为新行指定行号 NewRow=LastRow+1 '将数据从当前选项卡复制并粘贴到存档选项卡 工作表(“当前”)。激活 选择,复制 工作表(“存档”)。激活 范围(“A”&新行)。选择 Selection.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,skipblank:=Flase,转置:=False ''显示确认消息 MsgBox(“已存档的作业”) '重新显示 Application.ScreenUpdating=True Application.DisplayAlerts=True 端接头,vba,excel,Vba,Excel,如果复制间歇性失败,则可能是竞争条件。这里有一个小片段,可以重试粘贴几次: Sub PasteEx() On Error Resume Next Err.Clear ActiveSheet.Paste Link:=True If Err.Number = 0 Then GoTo PasteEx_Exit Else For i = 1 To 3 Err.Clear ActiveS

如果复制间歇性失败,则可能是竞争条件。这里有一个小片段,可以重试粘贴几次:

Sub PasteEx()
    On Error Resume Next
    Err.Clear
    ActiveSheet.Paste Link:=True
    If Err.Number = 0 Then
        GoTo PasteEx_Exit
    Else
        For i = 1 To 3
            Err.Clear
            ActiveSheet.Paste Link:=True
            If Err.Number = 0 Then
                GoTo PasteEx_Exit
            End If
            Application.Wait Now + TimeValue("0:00:01") ' Adjust as needed
        Next i
    End If
    On Error GoTo 0
    Err.Raise 1004

PasteEx_Exit:
    On Error GoTo 0
End Sub
添加此方法并将
ActiveSheet.Paste链接:=True
替换为
pastex
。 那里有耽搁。根据需要进行调整。
因为我不能复制你的情况,我不确定它是否能帮助你。试试看

在代码中粘贴数据之前进行复制。这是什么意思?使用.select将清除复制的数据,因此在我运行您提供的代码时使用“复制目标代码”。我在
Err.Raise 1004
上遇到一个错误,表明重复粘贴没有帮助。尝试将
DoEvents
添加为
Sub…
之后的第一行
Sub pastex()
然后这不是解决方案
    '///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'
'This code imports select data from specified project's cost tracking spread sheet.
'
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Sub ImportProjectStatus()

'Minimize runtime
Application.ScreenUpdating = False
Application.DisplayAlerts = False

'Initialize Variables
Dim summarywb As Workbook
Dim sourcewb As Workbook
Dim currentVer As String

Dim FirstRow As Long
Dim LastRow As Long
Dim NewRow As Long

Dim NewJobNumber As String
Dim PTRange As String

'Set initial values
Set summarywb = ThisWorkbook
currentVer = "0.8.0"


'Open file selection dialog box
Application.FileDialog(msoFileDialogOpen).AllowMultiSelect = False
openFile = Application.FileDialog(msoFileDialogOpen).Show
If openFile <> 0 Then
    sourcewbpath = Application.FileDialog(msoFileDialogOpen).SelectedItems(1)           'Select the corresponding master file
Else
    sourcewbpath = ""
    Exit Sub
End If

Set sourcewb = Workbooks.Open(sourcewbpath)

'Error Handling - If there is no reporting tab on a tracking sheet
On Error GoTo NoReportTabError

'Searches for first non-blank row with data
FirstRow = summarywb.ActiveSheet.Cells.Find(What:="Project #", After:=Range("A1"), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Row + 1

'Searches for last non-blank row
LastRow = summarywb.ActiveSheet.Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row

'Sets Row to which new data will be imported
NewRow = LastRow + 1

'Checks if to-be imported job number is a duplicate
NewJobNumber = sourcewb.Sheets("Reporting").Range("P2")

If DuplicateCheck(summarywb, FirstRow, LastRow, NewRow, NewJobNumber) = 1 Then
    If MsgBox(NewJobNumber & " already exists. Continue?", vbYesNo, "Confirm") = vbNo Then
        'Close sourcewb
        sourcewb.Close savechanges:=False
        'Display back on
        Application.ScreenUpdating = True
        Application.DisplayAlerts = True
        'Abort message
        MsgBox "Job not added."
        Exit Sub
    End If
End If

'Imports Project#
sourcewb.Sheets("Estimate").Range("PROJECT_NUMBER").Copy       'project# info is located on "Reporting" tab
summarywb.ActiveSheet.Activate
summarywb.ActiveSheet.Cells(NewRow, 1).Select
ActiveSheet.Paste Link:=True

'Imports Client Name
sourcewb.Sheets("Estimate").Range("PROJECT_CLIENT").Copy       'C3 is where client name info is located on "Reporting"
summarywb.ActiveSheet.Activate
summarywb.ActiveSheet.Cells(NewRow, 2).Select
ActiveSheet.Paste Link:=True

'Imports Project Name
sourcewb.Sheets("Estimate").Range("PROJECT_NAME").Copy       'C2 is where project name info is located on "Reporting"
summarywb.ActiveSheet.Activate
summarywb.ActiveSheet.Cells(NewRow, 3).Select
ActiveSheet.Paste Link:=True

'Imports Latest Revision Date
sourcewb.Sheets("Reporting").Range("O5").Copy               'P5 is where project name info is located on "Reporting"
summarywb.ActiveSheet.Activate
summarywb.ActiveSheet.Cells(NewRow, 19).Select
ActiveSheet.Paste Link:=True

'Imports data from Project Total line
sourcewb.Sheets("Reporting").Range("C24:Q24").Copy       'Row 24 is where Project Total line is located on "Reporting"

PTRange = "D" & NewRow & ":" & "R" & NewRow

summarywb.ActiveSheet.Activate
summarywb.ActiveSheet.Range(PTRange).Select
ActiveSheet.Paste Link:=True

'Adds "N" to closed column
summarywb.ActiveSheet.Cells(NewRow, 20) = "N"

CleanExit:
    'Line to display which line a new job was added to
    MsgBox NewJobNumber & " added to line " & NewRow

    'Close sourcewb
    sourcewb.Close savechanges:=False

    'Refresh Data (Note. Refreshes all links)
    RefreshAllLinks

    'Display back on
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

    Exit Sub

NoReportTabError:
    MsgBox "No Reporting tab found on the specified Tracking workbook. Closing Macro."
    'Close sourcewb
    sourcewb.Close savechanges:=False

    'Display back on
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

    Exit Sub

End Sub
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'
'This code checks for job numbers that are duplicate of the one to be added.
'
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Private Function DuplicateCheck(summarywb, FirstRow, LastRow, NewRow, NewJobNumber)

Dim CheckCell As String

summarywb.ActiveSheet.Activate

For i = FirstRow To LastRow
    Range("A" & i).Select
    Selection.Copy
    Range("A" & NewRow).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=Flase, Transpose:=False
    CheckCell = Cells(NewRow, 1).Value
    If CheckCell = NewJobNumber Then
        DuplicateCheck = 1
        Range("A" & NewRow).Clear
        Exit Function
    End If
    Range("A" & NewRow).Clear
Next i

End Function
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'
'This code refreshes all links in the active worksheet.
'
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Sub RefreshAllLinks()

'Minimize runtime
Application.ScreenUpdating = False
Application.DisplayAlerts = False

'Initialize Variables
Dim summarywb As Workbook

'Set initial values
Set summarywb = ThisWorkbook

'Refresh all linked data
summarywb.ActiveSheet.Activate
summarywb.UpdateLink Name:=summarywb.LinkSources

'Display back on
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'
'This code moves highlighted line(s) of data from current to archive tab.
'
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Sub ArchiveData()

'Minimize runtime
Application.ScreenUpdating = False
Application.DisplayAlerts = False

'Initialize Variables
Dim summarywb As Workbook
Dim LastRow As Long
Dim NewRow As Long

'Set initial values
Set summarywb = Workbooks("Project Status Summary.xlsm")

'Asks for confirmation
If MsgBox("Archive highlighted job(s)?", vbYesNo, "Confirm") = vbNo Then

    'Display back on
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

    'Abort message
    MsgBox "Job(s) not archived."
    Exit Sub
End If

'Finds last non-blank row on Archive sheet
Worksheets("Archive").Activate
LastRow = summarywb.Sheets("Archive").Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row

'Assigns row number for a new line
NewRow = LastRow + 1

'Copies and pastes data from Current tab to Archive tab
Worksheets("Current").Activate
Selection.Copy
Worksheets("Archive").Activate
Range("A" & NewRow).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=Flase, Transpose:=False

''Displays confirmation message
MsgBox ("Job(s) archived.")

'Display back on
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Sub PasteEx()
    On Error Resume Next
    Err.Clear
    ActiveSheet.Paste Link:=True
    If Err.Number = 0 Then
        GoTo PasteEx_Exit
    Else
        For i = 1 To 3
            Err.Clear
            ActiveSheet.Paste Link:=True
            If Err.Number = 0 Then
                GoTo PasteEx_Exit
            End If
            Application.Wait Now + TimeValue("0:00:01") ' Adjust as needed
        Next i
    End If
    On Error GoTo 0
    Err.Raise 1004

PasteEx_Exit:
    On Error GoTo 0
End Sub