2016-11-25 6 views
0

私はイントラネットからシートをダウンロードし、この宛先シートにソースシートからのデータを入力するために、ボタン付きのフォームを使用しています。この部分は動作します:データが入力され、フォームのアンロード、スクリプトの停止、アクティブなスクリーンとしての宛先シートがあります。
問題は次のとおりです。セルを選択することはできますが、Excelでは機能を使用できず、クイックアクセスリボンの[ファイル]、[ホーム]、[保存]などのボタンを押すことはできません。 ESCを押すことは役に立ちません。 Excelをフリーズする唯一のことは、ランダムなセルのどこかでマウスの右ボタンを押すことです。それは 'unlocks' Excelと私はファイルメニューに行くことができます。私はどこを見るか分からない。私はそれが何か小さいと思うが、それが何であるか理解できない。コード実行後にExcelのメニューバーがフリーズします。右マウスをクリックしてフリーズ解除する

これはコードある(ジャンプは単一または複数の項目のために使用され、それが1つの項目のためなら、私はループをスキップ多分これのためのより良いオプションがあります。。?):私は

Private Sub genbutton_Click() 
    On Error GoTo 0 

    Dim startsheet As String 
    startsheet = ActiveSheet.Name 
    roww = ActiveCell.Row 

    Set Source = ActiveWorkbook.ActiveSheet 

    'search for column in source sheet 
    kolommaint = kolomnaam2("Maintenance Plan") 
    kolomfloc = kolomnaam2("Functional Location") 
    kolomdescrip = kolomnaam2("Maintenance item description") 
    kolomequip = kolomnaam2("Equipment") 

    'find last row on data source page 
    With ActiveSheet 
     lastrow = .Cells(.Rows.Count, kolommaint).End(xlUp).Row 
    End With 

    Set destinationsheet = Workbooks.Open("http:// sheet on intranet.xlsm") 

    'find first data row on destination sheet 
    Dim FindString As String 
    Dim Rng As Range 
    FindString = "Action" 
    With destinationsheet.Sheets("Data input").Range("A:A") 
     Set Rng = .Find(What:=FindString, _ 
        After:=.Cells(.Cells.Count), _ 
        LookIn:=xlValues, _ 
        LookAt:=xlWhole, _ 
        SearchOrder:=xlByRows, _ 
        SearchDirection:=xlNext, _ 
        MatchCase:=False) 
     If Not Rng Is Nothing Then 
      Application.Goto Rng, True 
      datarij = ActiveCell.Row + 1 
     End If 
    End With 
    'make a jump to avoid loop if only 1 item is needed 
    If callsingle.Value = True Then 
     i = roww 

     If Source.Range(kolommaint & i).Value = "" Then 
      GoTo verdergaan 
     End If 
     GoTo jump 
    End If 

    For i = eerstedatarij To lastrow 

jump: 
     'skip row if empty 
     If Source.Rows(i).Hidden = True Then 
      GoTo verdergaan 
     End If 

     destinationsheet.Sheets("Data input").Range("A" & datarij).Value = "Release Call" 
     destinationsheet.Sheets("Data input").Range("B" & datarij).Value = Source.Range(kolommaint & i).Value 
     destinationsheet.Sheets("Data input").Range("C" & datarij).Value = "PM" 
     destinationsheet.Sheets("Data input").Range("E" & datarij).Value = Source.Range(kolomdescrip & i).Value 
     destinationsheet.Sheets("Data input").Range("F" & datarij).Value = Source.Range(kolomdescrip & i).Value 
     destinationsheet.Sheets("Data input").Range("G" & datarij).Value = Source.Range(kolomfloc & i).Value 
     destinationsheet.Sheets("Data input").Range("H" & datarij).Value = Source.Range(kolomequip & i).Value 

     datarij = datarij + 1 

     'make jump if single item is used 
     If callsingle.Value = True Then 
      GoTo jump2 
     End If 

verdergaan: 
    Next i 
jump2: 

    destinationsheet.Sheets("Data input").Range("A13").Select 

    Set Source = Nothing 
    Set destinationsheet= Nothing 

    Unload Me 

End Sub 
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) 
Const MOUSEEVENTF_RIGHTDOWN = &H8 
Const MOUSEEVENTF_RIGHTUP = &H10 

Public Sub RightDown() 
    mouse_event MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0 
    mouse_event MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 
End Sub 
+0

Forループに「ジャンプ」することはできません。エラー処理以外のGoToの使用を避けてください。 Forループを停止したい場合は、 "Exit For"を使用してください。 –

+0

私はコードコメントで型を作りました。そのループに入っていないために、より多くのジャンプ。コメントのおかげで、私はExit Forを試してみるつもりです。私は多くの機能のためにジャンプを使用しますが、凍った画面では問題に遭遇することはありません。 – bob

答えて

0

Excel機能でフリーズすると同様の問題が発生しました。ワークシートを "Worksheets.Open"で開いているときにフォーカスバグが発生したと考えられます。

"Worksheets.Open"を実行するときにユーザーフォームが表示されているときに問題が発生しました。最初にユーザーフォームを隠してから、ワークシートを開いてフリーズ問題を回避しなければなりませんでした。

Excel関数の凍結を起こしコード:

Private Sub btnBrowse_Click() 
    Dim retVal As Integer 
    Dim fDialog As FileDialog 
    Set fDialog = Application.FileDialog(msoFileDialogFilePicker) 

    fDialog.AllowMultiSelect = False 
    retVal = fDialog.Show() 

    If retVal = -1 Then 
    Application.Workbooks.Open fDialog.SelectedItems(1) 
    Me.Hide ' Hiding my userform 
    End If 
End Sub 

しかし、私は非表示とフリーズの解決策を発見し、ワークシートのウィンドウを表示します。

Dim aWorkbook As Workbook 
    Set aWorkbook = ActiveWorkbook 
    aWorkbook.Windows(1).Visible = False 
    aWorkbook.Windows(1).Visible = True 

それが機能しました。唯一の欠点は、可視性を変更するとワークシートが変更された状態になることです。可能であれば、ブックを開く前にユーザーフォームを非表示にするほうがよいでしょう。

関連する問題