2017-11-27 3 views
0

メンバーの皆様のおかげで、このコードを釘付けにするのは本当に近いです。プールプランニングに使用される大きなカレンダーがあり、セルの範囲内でスケジュールに応じた値を持ちます。私は、すべての値にコメントが追加される必要があるときに押すための更新ボタンを作成しました。彼らは別のシートからデータを引き出しています。すべてのコードは最後を除いて動作します。 がハイライト表示され、セルに値が存在しないコメントは削除されません。私は問題が最後の行/ colコールアウトだと思うが、私は私の問題を解決するために見つけたものを使用する技術的なスキルを持っていないフォーラムを見て後。このError in finding last used cell in VBAが見つかりました - 役に立つと思われます。Excel VBAエラー9サブアウトオブレンジ - 最終行/コラムを修正する必要がある可能性があります

Private Sub Update_Click() 

    Dim arr As Variant, element As Variant 
    Dim i As Long, j As Long, listItems As Long, rwLast As Long, clLast As Long 
    Dim comm As String 
    Dim rng As Range, cell As Range 

    listItems = Sheets("list").Range("A1").End(xlDown).Row 
    rwLast = Cells.SpecialCells(xlCellTypeLastCell).Row ' Adjust to fit your needs 
    clLast = Cells.SpecialCells(xlCellTypeLastCell).Column 'Idem 

    Set rng = Sheets("list").Range("A1:A" & listItems) 
    arr = Range("D11:CY148").Value 

    With Worksheets("Finish Matrix") 
     For i = 1 To rwLast - 10 'Adjust to make it more general, this is pretty rough 
      For j = 1 To clLast - 3 'Idem 
       If i = 3 Then 
       End If 
       comm = "" 
       For Each cell In rng 
        If arr(i, j) = cell.Value Then 
         comm = comm & Chr(13) & cell.Offset(0, 1).Value 
        End If 
       Next cell 
       If Not (comm = "") Then 
        .Cells(10, 3).Offset(i, j).ClearComments 
        .Cells(10, 3).Offset(i, j).AddComment 
        .Cells(10, 3).Offset(i, j).Comment.Text Text:=comm 
       End If 
      Next j 
     Next i 
    End With 

End Sub 

確かに私のコードにマイナーな調整がありません。私はむしろそれを可能な限り簡単な解決策にしておきたい。前もって感謝します。

+0

を。 SpecialCells(xlCellTypeLastCell).Columnが問題になるはずです。配列をarr = Range( "D11:CY148")。Valueとして設定すると、なぜclLast = 100に設定してから内部Forループを開始するのですか?For j = 1 To UBound(arr、2)? – sktneer

+0

私はあなたが '内部ForループをJ = to UBound(arr、2)のように開始すると言うとき、あなたは何を意味するのか分かりません。私はプログラミングの初心者であり、VBAを本当に理解していないので、語彙または推論。 –

答えて

0

最後の行と列を検索するには、このVBA UDFを試すことができます。

Function LastRowCol(Worksht As String) As Long() 
Application.Volatile 
    Dim WS As Worksheet, R As Range 
    Dim LastRow As Long, LastCol As Long 
    Dim L(1) As Long 
Set WS = Worksheets(Worksht) 
With WS 
    Set R = .Cells.Find(what:="*", after:=.Cells(1, 1), _ 
        LookIn:=xlValues, searchorder:=xlByRows, _ 
        searchdirection:=xlPrevious) 

    If Not R Is Nothing Then 
     LastRow = R.Row 
     LastCol = .Cells.Find(what:="*", after:=.Cells(1, 1), _ 
        LookIn:=xlValues, searchorder:=xlByColumns, _ 
        searchdirection:=xlPrevious).Column 
    Else 
     LastRow = 1 
     LastCol = 1 
    End If 
End With 

L(0) = LastRow 
L(1) = LastCol 
LastRowCol = L 
End Function 

あなたは、あなたのコードに次のようなものを使用することができますラインclLast =細胞

Dim rwLast As Long, clLast As Long 
    Dim wsName As String 
    Dim rLcL As Variant 

wsName = Worksheets("sheet1").Name 'change to desired worksheet 

rLcL = lastrowcol(wsName) 

rwLast = rLcL(0) 
clLast = rLcL(1) 

Debug.Print rwLast, clLast 
+0

私はVBA内のこのlastrow/col部分の必要性を理解していません。なぜ我々はこれを行うのですか?明確にするには - 最初のコードをブック内のモジュールにコピーします。元のコードに貼り付けた2番目のコードは? –

+0

@JamalLewis **あなたは**書きました:*最後の行/ colコールアウトで問題が発生していると思います*最後の行と列を決定するための別のより堅牢な方法を提供しました。そして、私はあなたのマクロ内でそれを使用する方法の例を提供しました。最後の行/列を決定することがあなたの問題でない場合は、なぜあなたがしたことを書いたのか分かりません。 –

+0

修正**私は思っています**。これは私のコーディングの知識がプッシュされた最も深いものです。私は実際に何をしているのか分かりません。私はまた、「**私は私が見つけたものを使用するための技術的スキルはない」と私のポストでは、私のコードで明らかに私に問題を示すメンバーからの投稿を得るのに役立ち、理解することができ、再び同じ問題に対処する必要はありません。率直に言って、私は個人的にこの最後の行/列についてはまったく気にしません。私はちょうど与えられた範囲内でリフレッシュするコードを、値の有無にかかわらず、セルにコメントを調整/追加/削除するだけです。 –

関連する問題