2016-05-28 7 views
0

Lightフォーマットを行うSubを持っていて、その列に "1"か何も含まれていないかどうかを評価してカウントする必要があります。 isNumericかどうかのヘッダー。Excel "Do While" Loopが最初の繰り返しの後に正しく機能しない

Do ... Untilループの最初の反復処理は、まさにそのように機能します。しかし、2回目に実行しようとすると、ワークシート(XFD)の右端の列にアクティブなセルがすべてスローされます。私はこれをループするために必要な合計約114,000行を持っています。

最初のループのみで、以下のコードをご覧ください。これは、すべての行を循環する別のループの中に入れ子にする必要があります:

Sub TotalBookCountsProcess() 

    Dim ws As Excel.Worksheet 
    Dim numberedBooks As Integer 'Total Number of physical books 
    Dim virtualBooks As Integer 'Total Number of virtual books 
    Dim firstBookCol As Integer 'First Column with a book number 
    Dim ispeecCol As Integer 'ISPEC Column 
    Dim lastWorksheetCol As Integer 'Last Column in the worksheet after adding total book count columns 
    Dim loopColOffset As Integer 'Offset column amounts for new row reset after loop 
    Dim lastItem As String 'Last item number in last row of the worksheet 

    ActiveCell.End(xlDown).Select 
    lastItem = ActiveCell.Value 
    ActiveCell.End(xlUp).End(xlToRight).Select 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.Value = "Total Numbered Books" 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.Value = "Total CS Books" 
    lastWorksheetCol = ActiveCell.Column 

    Columns.AutoFit 

    numberedBooks = 0 
    virtualBooks = 0 

    Cells.Range("1:1").Find("ISPEC").Select 

    ispecCol = ActiveCell.Column 
    firstBookCol = ispecCol + 1 
    ActiveCell.Offset(1, 1).Select 

    loopColOffset = ((lastWorksheetCol - firstBookCol) * -1) 

Do Until ActiveCell.End(xlUp).Value = "Total Numbered Books" 
    If ActiveCell.Value = 1 And IsNumeric(ActiveCell.End(xlUp).Value) = True Then 
     numberedBooks = numberedBooks + 1 
     ActiveCell.Offset(0, 1).Select 
    ElseIf ActiveCell.Value = 1 And IsNumeric(ActiveCell.End(xlUp).Value) = False Then 
     virtualBooks = virtualBooks + 1 
     ActiveCell.Offset(0, 1).Select 
    Else 
     ActiveCell.Offset(0, 1).Select 
    End If 
Loop 

    ActiveCell.Value = numberedBooks 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.Value = virtualBooks 
    ActiveCell.Offset(1, loopColOffset).Select 



End Sub 

洞察力は大変ありがたいです。

+0

を活性化されていることを確認しシートのスクリーンショットを添付しますか?すべてのセルをルーピングするのではなく、試行していることを達成するためのより良いオプションがあります。 – Spidey

+0

これを行うにはVBAは必要ありません。これは、セル内式で行うことができます。 – trincot

+0

データが "A1"で始まると仮定すると、 'ActiveCell.Worksheet.Range(" A1 ")を試してください。最初の行を選択してください –

答えて

0

ループの終了条件が

あなたの本当の目標は、できるだけ早くActiveCell列は「トータル番号付きブック」を有するものであるとして、行のループを終了するためにあったような理由が

ActiveCell.End(xlUp).Value = "Total Numbered Books" 

にありその最初の行の値

しかし

  • ActiveCell.End(xlUp).Valueが列の最初の行の値が実際に細胞上の第2の反復からActiveCell

  • 上記の最初の非空のセルを参照することになる「総番号付き書籍」はまた、それ自体がnumberedBooks値で満たさ直上セルを有する

  • ですので、列の最後まで次の列にスキップし続けます...

、その後のような可能性があなたのコードは次のとおりです。私も行ループを追加

Option Explicit 

Sub TotalBookCountsProcess() 

    Dim ws As Excel.Worksheet 
    Dim numberedBooks As Integer 'Total Number of physical books 
    Dim virtualBooks As Integer 'Total Number of virtual books 
    Dim firstBookCol As Integer 'First Column with a book number 
    Dim ispeecCol As Integer 'ISPEC Column 
    Dim lastWorksheetCol As Integer 'Last Column in the worksheet after adding total book count columns 
    Dim loopColOffset As Integer 'Offset column amounts for new row reset after loop 
    Dim lastItem As String 'Last item number in last row of the worksheet 
    Dim ispecCol As Long 

    ActiveCell.End(xlDown).Select 
    lastItem = ActiveCell.Value 
    ActiveCell.End(xlUp).End(xlToRight).Select 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.Value = "Total Numbered Books" 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.Value = "Total CS Books" 
    lastWorksheetCol = ActiveCell.Column 

    Columns.AutoFit 

    numberedBooks = 0 
    virtualBooks = 0 

    Cells.Range("1:1").Find("ISPEC").Select 

    ispecCol = ActiveCell.Column 
    firstBookCol = ispecCol + 1 
    ActiveCell.Offset(1, 1).Select 

    loopColOffset = ((lastWorksheetCol - firstBookCol) * -1) 

Do 
    numberedBooks = 0 
    virtualBooks = 0 
    Do Until Cells(1, ActiveCell.Column) = "Total Numbered Books" 
     If ActiveCell.Value = 1 Then 
      If IsNumeric(Cells(1, ActiveCell.Column)) Then 
       numberedBooks = numberedBooks + 1 
      Else 
       virtualBooks = virtualBooks + 1 
      End If 
     End If 
     ActiveCell.Offset(0, 1).Select 
    Loop 

    ActiveCell.Value = numberedBooks 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.Value = virtualBooks 
    ActiveCell.Offset(1, loopColOffset).Select 
Loop Until Cells(ActiveCell.Row - 1, 1) = lastItem 


End Sub 

が、真の解決策ができます/すべてのそれらの選択を回避

+0

それはありました。ありがとう、私は間違いなくこのコード。 – axstros

+1

これは、マクロレコーダーを使用することの「副作用」として、私たちがすべて始まったコーディングの種類ですが、間もなく "Select/Selection"、 "Activate/Active"私の答えがあなたの質問を満たしていれば、受け入れられたとマークしてください。 – user3598756

0

まずは使用しないでください。選択してください...あなたはコードが遅くなり、選択されたセルのdependeになります。

コードは詳細に表示されませんでしたが、初めて正しく実行されたが、2回目ではないことを伝えると、通常は2回目の実行で選択されたセルが異なるために発生します。この問題を回避するための方法

  • まず解決策:

    範囲( "A1")関数で開始セルを課すSELECT 'これは

  • 第2の例です。解決策:あなたのコードをselectedCellのactiveCellから独立させる。ちょうど始めにアルゴリズムを開始するだけかもしれません。

    sheet1.range( "A1").....(コード内の選択とのActiveCellを使用していない)

最初のソリューションは、同じ開始条件に、常にあなたのシステムを置きます。 2番目の解決策は開始条件とは無関係です(より良い方法です)。

関連する問題