|
> 代入のところで値が違います。と出てきます。If Trim(v3(I, 1))
> そこで、LastRow3 = .Range & v3 = .Range の前に Ws3.Range としてみたり
> ↓不等号を < に変えてみたり色々と試してみたんですが、
> ["入力シートに設定できる行がありません。"]または、転記操作の
> Sheet3.Range("A" & NewRow) で [NewRow=0] となります。
多分、
I = NewRow
が
NewRow = I
の様な気がします
ついでに、コードをざっと見て行った時に
元のコードの解釈が違う様な気がしますので
私成りに書いて見ました
ただ、サンプルデータが無いので(作るのも面倒なので)Testはして居ません
間違っていたらゴメン
Option Explicit
Private Sub CommandButton1_Click()
Dim i As Long
Dim j As Long
Dim vntDate As Variant
Dim strPrompt As String
Dim Ws3 As Worksheet
Dim Ws4 As Worksheet
Dim lngFound As Long
Dim vntList As Variant
Dim vntResult As Variant
Dim vntFrom As Variant
Dim vntTo As Variant
Dim lngRows As Long
Dim NewRow As Long
Set Ws3 = Sheet3
Set Ws4 = Sheet4
vntDate = Me.TextBox1.Text
If vntDate = "" Then
strPrompt = "*****日を入力してください。"
GoTo Wayout
End If
'転記先の列番号を列挙
vntTo = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, _
11, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24)
'転記元の列番号を列強
'"A","C","D","E","F","G","H","I","J","K","AC"
',"X","X","Y","Y","Z","Z","AA","AA","AD","AE"の順で
vntFrom = Array(1, 3, 4, 5, 6, 7, 8, 9, 10, _
11, 29, 24, 24, 25, 25, 26, 26, 27, 27, 30, 31)
'Sheet4のA列最終行を取得
If IsEmpty(Ws4.Cells(Rows.Count, 1).Value) Then
lngRows = Ws4.Cells(Rows.Count, 1).End(xlUp).Row
Else
lngRows = Rows.Count
End If
lngFound = 2
NewRow = 3
'Sheet4A列でTextBox1と同じ日付の有る行を探索
Do While lngFound <= lngRows
If Ws4.Cells(lngFound, 1).Value = vntDate Then
'Sheet3の空き行位置を取得
Do While NewRow <= Rows.Count
If Trim(Ws3.Cells(NewRow, 1).Value) = "" Then
Exit Do
Else
NewRow = NewRow + 1
End If
Loop
If NewRow > Rows.Count Then
strPrompt = "入力シートに設定できる行がありません。"
GoTo Wayout
End If
'転記先データ行を配列に取得
vntResult = Ws3.Cells(NewRow, 1).Resize(, 24).Value
'転記元データ行を配列に取得
vntList = Ws4.Cells(lngFound, 1).Resize(, 31).Value
'データを転記
For i = 0 To UBound(vntFrom)
vntResult(1, vntTo(i)) = vntList(1, vntFrom(i))
Next i
vntResult(1, 14) = Sgn(vntResult(1, 14)) * Int(Abs(vntResult(1, 14)) / 21 * 35)
vntResult(1, 18) = Sgn(vntResult(1, 18)) * Int(Abs(vntResult(1, 18)) / 4 * 7)
For i = 14 To 22 Step 2
vntResult(1, 12) = vntResult(1, 12) + vntResult(1, i)
Next i
'更新データをシートに出力
Ws3.Cells(NewRow, 1).Resize(, 24).Value = vntResult
'転記元行を削除
Ws4.Rows(lngFound).Delete Shift:=xlUp
'データ転記 ★上記コードで代用
' With Ws4
' Ws3.Cells(NewRow, 1).Value = .Range("A" & lngFound).Value
' Ws3.Cells(NewRow, 2).Value = .Range("C" & lngFound).Value
' Ws3.Cells(NewRow, 3).Value = .Range("D" & lngFound).Value
' Ws3.Cells(NewRow, 4).Value = .Range("E" & lngFound).Value
' Ws3.Cells(NewRow, 5).Value = .Range("F" & lngFound).Value
' Ws3.Cells(NewRow, 6).Value = .Range("G" & lngFound).Value
' Ws3.Cells(NewRow, 7).Value = .Range("H" & lngFound).Value
' Ws3.Cells(NewRow, 8).Value = .Range("I" & lngFound).Value
' Ws3.Cells(NewRow, 9).Value = .Range("J" & lngFound).Value
' Ws3.Cells(NewRow, 10).Value = .Range("K" & lngFound).Value
' Ws3.Cells(NewRow, 11).Value = .Range("AC" & lngFound).Value
' Ws3.Cells(NewRow, 13).Value = .Range("X" & lngFound).Value
' Ws3.Cells(NewRow, 14).Value _
' = Application.RoundDown(.Range("X" & lngFound).Value / 21 * 35, 0)
' Ws3.Cells(NewRow, 15).Value = .Range("Y" & lngFound).Value
' Ws3.Cells(NewRow, 16).Value = .Range("Y" & lngFound).Value
' Ws3.Cells(NewRow, 17).Value = .Range("Z" & lngFound).Value
' Ws3.Cells(NewRow, 18).Value _
' = Application.RoundDown(.Range("Z" & lngFound).Value / 4 * 7, 0)
' Ws3.Cells(NewRow, 19).Value = .Range("AA" & lngFound).Value
' Ws3.Cells(NewRow, 20).Value = .Range("AA" & lngFound).Value
' Ws3.Cells(NewRow, 23).Value = .Range("AD" & lngFound).Value
' Ws3.Cells(NewRow, 24).Value = .Range("AE" & lngFound).Value
' Ws3.Cells(NewRow, 12).Value = Ws3.Cells(NewRow, 14).Value _
' + Ws3.Cells(NewRow, 16).Value _
' + Ws3.Cells(NewRow, 18).Value _
' + Ws3.Cells(NewRow, 20).Value _
' + Ws3.Cells(NewRow, 22).Value
' .Rows(lngFound).Delete Shift:=xlUp
' End With
'行データ削除により最終行を1つ減らす
lngRows = lngRows - 1
'次の空白行探す為、1行下へ
NewRow = NewRow + 1
Else
lngFound = lngFound + 1
End If
Loop
strPrompt = "日付列行末に達しましたので終了します"
Wayout:
Set Ws3 = Nothing
Set Ws4 = Nothing
MsgBox strPrompt, vbInformation
End Sub
|
|