2016-09-19 2 views
1

명명 된 베이가있는웨어 하우스를 나타내는 데이터베이스를 만들려고합니다. 이 기능에는 로그인 자료와 필요할 때 언제든지 확인할 수있는 기능이 있습니다.Excel VBA - 셀이 비어있는 경우 입력, 그렇지 않으면 반환 오류

My excel 통합 문서에는 로그인 시트가 있으며 행 A에서 행 G까지 레이블이 지정된 7 개의 시트가웨어 하우스의 통로를 나타냅니다. 각 통로에는 5 개의 선반과 여러 개의 베이가 있습니다. 이 정보는 연결되어 고유 한 위치를 제공합니다. 현재 VBA에 소재를 할당 할 위치가 비어 있는지 여부를 확인하는 데 어려움을 겪고 있습니다. 그렇다면 Log In 시트에서 복사 한 정보를 붙여 넣어야합니다. 불행히도, 내 시트에 무엇이든 상관없이 코드는 ActiveCell을 "TRUE"로 채우고 그것이 사실이 아닌 경우 요청한 오류 메시지를 표시합니다. 같은 결과로 IfEmpty도 시도했습니다.

내 코드는 다음과 같습니다 : 당신이 잘못 Selection를 사용하는

Sub LogIn() 

Dim Row As String 
Dim Location As String 

' assign values to variables 
    Worksheets("Log In").Activate 
     Location = Cells(6, 3).Value 
     Row = Cells(3, 3).Value 

' copy new inputs to clipboard 
    Sheets("Log In").Range("C8:C11").Copy 

' find the correct location within the separate racking sheets 
    Sheets("Row " & Row).Activate 
    Selection = Cells.Find(What:=Location, After:=Cells(1, 1), LookIn:=xlFormulas, _ 
     lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext, _ 
     MatchCase:=False, searchformat:=False).Activate 
    Selection = Sheets("Log In").Cells(6, 3).Value 
    Selection = ActiveCell.Offset(0, 2).Activate 

' check whether location is empty 
    If ActiveCell.Value = "" Then 

' paste new inputs onto racking sheet 
     ActiveCell.PasteSpecial 

' or return an error 
     Else: MsgBox "The location you have selected is currently occupied" 
     End If 

End Sub 

답변

3

. 우선 무슨 일이 일어나는지 설명하고 잘하면 그것을 고치는 법을 설명 할 것입니다.

당신은 그것은 "안녕하세요"를 선택한 셀을 채우는

Selection = "Hello" 

같은 것을 쓸 때. 엑셀은 당신이 Selection = something.Activate를 사용하는

Selection.Value = "Hello" 

와 동일합니다 즉, Selection는 "안녕하세요"대신 선택한 모든 셀에 "안녕하세요"의 값을 설정하도록 설정 할 수없고 그 선택하려는 의미 가정 something. 그것은 당신이 원하는 방식으로하지 않습니다.

something.Activate은 셀 또는 범위 something을 활성화 (따라서 선택)합니다. 또한 부울 값 True을 반환합니다 (나는 다른 사람이 도울 수있는 경우 False을 반환 할시기를 모르겠습니다). 따라서 라인 Selection = something.Activate이 실행되면 VBA는 =의 오른쪽에있는 것을 평가하고 True을 반환합니다 (평가 중에는 something도 선택 함). 이제 Selection.ValueTrue으로 설정하고 something이 선택되었으므로 something.ValueTrue으로 설정됩니다.


지금 당신이 할 수있는 최선의 일은 SelectionActivate 사용을 중지하는 것입니다. 사용자 입력의 일종으로 ActiveCell을 사용해야하는 경우 범위의 시작 부분에 ActiveCell을 설정하고 필요할 때 사용합니다.

항상 ActiveCell을 변경하는 대신 변수를 사용하십시오. 다음과 같은 것 :

Dim myCell as Range 
'... 
Set myCell = Sheets("Row " & Row).Cells.Find(.... 'You should rename Row because it's already a property of Range. 
myCell.Value = Sheets("Log In").Cells(6, 3).Value 
Set myCell = myCell.Offset(0, 2) 

If myCell.Value = "" Then 
'... 
+0

정말 잘 알고 있습니다. 시간을 절약하고 재기록하기 위해 필자는'ActiveCell.Offset'의 앞에서'Selection ='을 제거함으로써 간단하게 작동 시켰습니다. –

관련 문제