2012-11-20 1 views
0

저는 Excel에서 VBA를 처음 사용했습니다. 데이터를 시트에 배치하는 기본적인 사용자 폼이 있습니다. 폼으로부터의 데이터는 셀 B13 내지 셀 G13에 들어가야하고, 이후의 모든 다른 엔트리는 예를 들어 다음 행에서 수행되어야한다. B14-G14. 내가 올바른 셀에 데이터를 입력 밤은 그러나 이미이 코드가 반복적으로 같은 행에 들어갈Excel에서 사용자 정의 폼을 통해 스프레드 시트에 데이터 입력

...

 Private Sub CommandButton1_Click() 

Dim lngWriteRow As Long 

Dim ws As Worksheet 
Set ws = Worksheets("Sheet1") 

lngWriteRow = ws.Cells(Rows.Count, 1) _ 
.End(xlUp).Offset(1, 0).Row 

If lngWriteRow < 13 Then lngWriteRow = 13 

    ws.Range("B" & lngWriteRow) = TextBox1.Value 
    ws.Range("C" & lngWriteRow) = TextBox2.Value 
    ws.Range("D" & lngWriteRow) = TextBox3.Value 
    ws.Range("E" & lngWriteRow) = ComboBox1.Value 
    ws.Range("F" & lngWriteRow) = TextBox4.Value 
    ws.Range("G" & lngWriteRow) = ComboBox2.Value 

End Sub 

내가 어떻게 이것을 달성 할 것인가? 여기

+0

다른 질문을 삭제하고 여기에서 수정해야합니다. 내가 당신에게 준 해결책에 대한 당신의 문제는 무엇입니까? 당신이 처음에 요구 한 것을했습니다. 그래서, 무엇이 바뀌 었습니까?! – Jook

+0

@Jook,'NextRow = Cells (Rows.Count, "A"). End (xlUp) .Row + 1'과 같은 것을 구현하면 항상 다음 행으로 가야합니다. – CustomX

+0

@ t.thielemans 나는 그의 문제가 다음 행에 그다지 많은 것이 아니라 13 행부터 시작하여 다음 행으로 이동하여 추가 데이터를 얻는다 고 생각한다. – Jook

답변

5

이 줄은 잘못 사전에

감사합니다 (이미 아래 행에 데이터가) :

lngWriteRow = ws.Cells(Rows.Count, 12) _ 
.End(xlUp).Offset(1, 0).Row 

당신은 변경하지 않는 열 (12),를 참조하기 때문에 - 따라서 행은 동일하게 유지됩니다.

사용이 대신

lngWriteRow = ws.Cells(Rows.Count, 2) _ 
.End(xlUp).Offset(1, 0).Row 

편집 :

lngWriteRow = ws.Cells(Rows.Count, 2) _ 
.End(xlUp).Offset(1, 0).Row 

if lngWriteRow < 13 then lngWriteRow = 13 
: 당신은 데이터 입력 @ 행 (13)을 시작 오프셋 초기을 원하는 경우

는 이것을 사용

매번 사용하기 때문에 Offset(12,0)을 사용할 수 없습니다!

편집 그냥 여기 빈 시트 작동, 맑은하기 위해, 워크 시트 매크로 타격 F5 여러 번 같은 코드를 붙여 넣을 때. 그래서, 설명이 없으면, 이것이 무엇을 잘못했는지, 나는 해결 된 문제를 고려한다.

Private Sub Test() 

Dim lngWriteRow As Long 

Dim ws As Worksheet 
Set ws = Worksheets("Sheet1") 

lngWriteRow = ws.Cells(Rows.Count, 2) _ 
.End(xlUp).Offset(1, 0).Row 

If lngWriteRow < 13 Then lngWriteRow = 13 

    ws.Range("B" & lngWriteRow) = "test" 
    ws.Range("C" & lngWriteRow) = "test" 
    ws.Range("D" & lngWriteRow) = "test" 
    ws.Range("E" & lngWriteRow) = "test" 
    ws.Range("F" & lngWriteRow) = "test" 
    ws.Range("G" & lngWriteRow) = "test" 

End Sub 

일부 메일 링 후

편집, 여기에이 수수께끼의 해결책이 : 그것은 입력되어야 그 아래 채워진 세포가 있다는 것을, 언급되지 않았다.

그래서 COL-B 것은 기본적으로 제안 된 수정이 일을 더

title-row 
row13 
row.. 
row.. 
row63 
space 
other stuff 

같았다 -하지만 문제였다 시트 전체에 열 B의 마지막 채워진 셀 보였다. 당신이 컬럼에 데이터를 추가되기 때문에,

대신 (Rows.Count,2)(Rows.Count,1)을 사용할 수 없습니다

lngWriteRow = ws.Cells(ws.Range("B12:B63")Rows.Count, 2) _ 
.End(xlUp).Offset(1, 0).Row 

그리고 당신에게 방법에 대한 몇 가지 explanaition을주는 : 여기

은의 해결책 BG, 2-7. 길 때문에 2-7을 사용해야하며, 마지막 행을 찾고 있습니다. 1을 사용하는 경우 새 데이터를 추가하려고 할 때 변경되지 않는 A 열의 마지막 값을 찾고 있습니다.

Offset(12,0)을 사용할 수 없습니다. 데이터를 삽입 할 때마다 오프셋이 만들어지기 때문에 12 행 간격으로 끝날 것입니다.

마지막으로 Rows.Count은 65536 정도이므로 추가 할 데이터 아래에 데이터가 있으므로 사용할 수 없습니다. End(xlUp)은 너무 멀리 내려다 보며 데이터가있는 B 열의 마지막 셀에서 멈 춥니 다.하지만 B14-B65536에 데이터가 없으면 B13이 아닙니다.

희망 사항은 여기에서 역학을 이해하는 데 도움이됩니다.

+0

+1 또한 값이 13보다 작지 않은지 확인하기 위해 +1합니다.) – CustomX

+0

나던 일은 여전히 ​​같은 셀에만 위치 할 것입니다. – user1662306

+0

@ user1662306 그런 다음 다른 것이 있어야합니다. – Jook

관련 문제