2014-01-24 4 views
0

나는 VBA를 사용하는 것에 아직 아주 익숙하다. 그래서 나는 모든 선호하는 용어를 모른다면 사과한다.워크 시트를 채우는 사용자 폼

스프레드 시트를 채우기 위해 userform을 작성하여 사용중인 직원 인 PTO를 추적 할 수있게하려고합니다. 이 스프레드 시트는 X 축 (1 행)이 날짜이고 Y 축 (A 열)이 종업원 이름입니다.

I 만든 정의 폼은 5 개의 기준을 가지고

I가 선택하고 스프레드 시트에 메뉴를 라벨링함으로써 기준 1 완료
1) Employee Name (ComboBox1; this is a drop down of multiple rows) 
2) Date of PTO (ComboBox2; this is supposed to be a drop down of multiple columns) 
3) Duration of PTO (OptionButton1 is 1 Day, OptionButton2 is 0.5 Day) 
4) Enter Data (CommandButton1) 
5) Cancel (CommandButton2) 

.

나머지는 나를 쫓아내는 것입니다.

행 형식으로 표시되는 동안 ComboBox2 드롭 다운에 날짜 (기준 2)가 표시되지 않습니다. 이 항목을 단일 열로 바꾸면 그룹에 레이블을 지정하고 드롭 다운 메뉴를 만들 수있었습니다. 채울 그리드를 구성 할 수 없으므로 문제가됩니다.

My OptionButton1 및 OptionButton2 항목은 입력 값 (1 및 0.5)을 사용합니다. 현재로서는 가치를 부여 할 수 없었습니다. 단순히 이름이었습니다. 이 입력은 그리드 형식을 작동시킬 수없는 주요 문제 (이 단락)에 부수적입니다.

Private Sub CommandButton1_Click() 
    cmdOK 
End Sub 

CommandButton2를이 코드를 사용하여 작업 할 나타납니다

삼차 문제로 인해 내 매우 기본적인 코드를 기준으로 4, 5 내 스크립트 내가 그것의 생각하지만, CommandButton1을 실행하기 위해 실패의 조합입니다 :

Private Sub CommandButton2_Click() 
    cmdCancel 
End Sub 

내 마지막으로 내 문제를 설명하면서 "내 목표는 가능합니까?" 나는 많은 사람들이 이미 그것에 접근 할 수 있기 때문에 Excel을이 용도로만 사용하려고합니다. 이것이 가능하다면 필자는 오류 지점을 식별하고 수정하는 데 도움을 요청하거나 기능에 대해 더 많이 배울 수있는 코딩 설명서에 대한 링크를 요청할 것입니다 (이것은 더 장기적인 상황으로, 문제를 해결하는데 도움이되지만, 나는 괜찮을 것입니다.)

미리 답변 해 주셔서 감사합니다.

편집 :

나는 ComboBox2 (날짜) 선택으로까지 만들었습니다 세스

@

. 아래에 제안 된 루프를 가져 와서 값 (1 행, 365 열)에 액세스 할 수 없습니다.

나는 세스에서 코드를 수정하려고했지만 루프에 대해서는 아무 것도 모른다. 내가 가장 가능성이 적절 섹션을 작성하지 않은 느낌 (나는 .Value <> ""찾고 있어요) :

개인 서브 ComboBox2_Change() 희미한 나는이 코드를 사용하여

i = 1 

Do While ThisWorkbook.ActiveSheet("Breakdown").Cells("A1:NC1", i).Value <> "" 

Me.ComboBox1.AddItem (ThisWorkbook.ActiveSheet("Breakdown").Cells("A1:NC1", i).Value) 
i = i + 1 

Loop 

End Sub 

한 , "런타임 오류 '438': 개체가이 속성 또는 메서드를 지원하지 않습니다."

루프 작성에 대한 일반적인 지침을 찾으려하지만 일부 참조는 찾을 수 없습니다. 위의 진술 중, 그래서 내 문제를 해결하는 방법을 긍정적이지 않다.상자의 속성과 관련이있을 수도 있습니다. 행을 반복하지 않지만 RowSource 아래에 "날짜"(강조 표시 및 레이블 지정으로 정의 된 해당 범위의 내 일반 용어)를 입력 할 수 있습니다.

알렉스 D @

나는 또한 내가받은 두 번째 게시물의 경로를 시도하고

; 사용하려고하면 런타임 오류가 발생합니다.

Private Sub UserForm_Initialize() 
    For i = 2 To Sheets("Breakdown").UsedRange.Columns.Count 
     comboDate.AddItem (Cells(1, i)) 
     comboDate.List(comboDate.ListCount - 1, 1) = i 
    Next 
End Sub 

데이터가 정의 된 곳에서 움직일 가능성이 있습니까? 일반적으로 시트에 단추가 있고 (일명 셀을 선택하고 userform이 튀어 나오기 때문에) 초기화가 필요하지 않을 수도 있습니다.

시릴 20140127 (1700 UTC)

답변

1

좋아, 이제 반대 방향으로 이동하자. 귀하의 마지막 질문에 "나의 최종 목표는 가능합니까?"대답은 "확실합니다." 나는 당신의 추론을 따르지 않지만 Excel을 사용하기를 원한다면 그렇게하십시오. 나는 이것이 PTO를 기록하는 고통스러운 방법이 될 것이라고 생각합니다. 예를 들어 일주일 내로 쉬는다면 어떨까요? 이 양식을 매일 한 번 작성해야합니까?

반대 방향으로 계속 이동하려면 버튼이 무엇인가해야합니다. cmdCancelcmdOK이 다른 곳에서 정의한 잠수정이라면 게시 한 내용이 명확하지 않으므로 그 내용을 잘 모릅니다. 취소 버튼에서 한 가지 기본적인 작업을 수행하고 양식을 닫아야합니다. 이것처럼 간단해야합니다, Unload Me.

확인 버튼은 매크로의 중요한 부분입니다. 사용자가 입력 한 값을 결합하는 곳입니다. 또한 옵션 버튼으로 무언가를 할 수 있습니다. 옵션 버튼에 실제로 값을 지정하지 않으면 Value 속성을 확인합니다. 당신은 두 가지 선택이 있기 때문에 명시 적으로 OptionButton2을 확인 할 필요가 없습니다 것을

If OptionButton1.Value = True Then 
    'Put 1 in the cell. 
Else 
    'Put .5 in the cell. 
End if 

참고 : 그래서, 사용자는 확인을 이런 식으로 뭔가를해야합니다 실행되는 코드를 클릭 할 때.

마지막으로 날짜입니다. 날짜가 스프레드 시트의 특정 행에 이미있는 것 같습니다. 여기에서해야 할 일은 해당 행의 셀을 순환하여 값을 콤보 상자 목록으로 가져 오는 것입니다. 이렇게하면 시작할 수 있습니다. UserForm_Activate 양식 이벤트 :

Dim i As Long 

i = 1 

Do While ThisWorkbook.ActiveSheet.Cells(DateRow, i).Value <> "" 

    Me.ComboBox1.AddItem (ThisWorkbook.ActiveSheet.Cells(DateRow, i).Value) 
    i = i + 1 

Loop 

이제 확인 버튼으로 돌아갑니다. 날짜 콤보 상자에서 선택한 항목을 가져와야합니다. 이렇게하려면 콤보 상자의 ListIndex 속성을 읽고 그 중 하나를 추가해야합니다. 콤보 상자의 목록이 1이 아닌, 시작하는 사실에 대해 하나의 계정을 추가합니다. 반환되는 숫자는 데이터를 삽입하는 열입니다. 당신이 시작

Dim Col As Long 
Dim Row As Long 
Dim PTOValue As Long 

Col = DateComboBox.ListIndex + 1 
Row = EmployeeNameComboBox.ListIndex + 1 

If FullDayComboBox.Value = True Then 
    PTOValue = 1 
Else 
    PTOValue = .5 
End if 

ThisWorkbook.ActiveSheet.Cells(DateRow, i).Value = PTOValue 

는 희망이 얻을 것이다 :

OK (확인) 버튼의 전체 코드는 무언가 같이 될 것입니다.

+0

대단히 감사합니다. 당신은 저에게이 부분에 대해 머리로 시작하는 것 이상을 주셨습니다. 나는 사소한 일에 강한 코더가 아니기 때문에 나를 도와 줄 시간을 내 주셔서 감사합니다. 목적을 자세히 설명하기 위해 계약직 직원이 회사에 직접 시간을 입력 할 때 계약 직원을위한 것입니다. 대부분 휴가가 연장되지 않으므로 1 일을 입력하는 "간단한"기능을 가진이 스프레드 시트는 문제가되지 않을 것입니다. 사람들이 일년에 5 일 이상을 얻지 못했기 때문에 장기 휴가에 관심을 가져 주셔서 감사합니다. – Cyril

+0

글을 삭제하여 글을 올릴 수 없어 단락을 만들 수 없습니다. – Cyril

0

기준을 채우고 이해할 수 있어야합니다. 셀 (2,1)에서 이름이 시작되고 셀 (1,2)에서 날짜가 사용된다고 가정합니다. 가지고있는 것에 따라 요소의 이름을 변경해야 할 수도 있습니다. 그러나 당신이 묘사 한 것과 같은 것을 완벽하게 만들었고 완벽하게 작동합니다.

오류를 방지하기 위해 일부 데이터 유효성 검사가 필요하지만이를 처리 할 수 ​​있어야합니다.

'Ok button which sets the values 
Private Sub CommandButton1_Click() 
    Columns("A:A").Select 
    If OptionButton1.Value = True Then 
     Cells(Get_Name_Row(comboName.Text), Get_Date_Column(comboDate.Text)).Value = 1 
    Else 
     Cells(Get_Name_Row(comboName.Text), Get_Date_Column(comboDate.Text)).Value = 0.5 
    End If 
End Sub 

'Cancel Button 
Private Sub CommandButton2_Click() 
    Unload Me 
End Sub 

'This loads the dates into your comboBox, make sure to update its name 
'I assume you use RowSource for your names, so those should be fine 
Private Sub UserForm_Initialize() 
    For i = 2 To Sheets("Sheet1").UsedRange.Columns.Count 
     comboDate.AddItem (Cells(1, i)) 
     comboDate.List(comboDate.ListCount - 1, 1) = i 
    Next 
End Sub 

'Gets what row the name is from 
Public Function Get_Name_Row(SearchString As String) As Integer 
    Dim Rng As Range 
    If Trim(SearchString) <> "" Then 
     With Sheets("Sheet1").Range("A:A") 
      Set Rng = .Find(What:=SearchString, _ 
          After:=.Cells(.Cells.Count), _ 
          LookIn:=xlValues, _ 
          LookAt:=xlWhole, _ 
          SearchOrder:=xlByRows, _ 
          SearchDirection:=xlNext, _ 
          MatchCase:=False) 
      If Not Rng Is Nothing Then 
       Get_Name_Row = CInt(Rng.Row) 
      End If 
     End With 
    End If 
End Function 

'Gets what column the date is from 
Public Function Get_Date_Column(SearchString As String) As Integer 
    Dim Rng As Range 
    If Trim(SearchString) <> "" Then 
     With Sheets("Sheet1").Range("A1").EntireRow 
      Set Rng = .Find(What:=SearchString, _ 
          After:=.Cells(.Cells.Count), _ 
          LookIn:=xlValues, _ 
          LookAt:=xlWhole, _ 
          SearchOrder:=xlByRows, _ 
          SearchDirection:=xlNext, _ 
          MatchCase:=False) 
      If Not Rng Is Nothing Then 
       Get_Date_Column = (Rng.Column) 
      End If 
     End With 
    End If 
End Function 
+0

'와우'보다 말할 것도 없습니다. 이 시간을 보내 주셔서 감사합니다. 나는 그것이 당신의 부분에 너무 많은 노력을 기울이지 않았기를 바랍니다. 내가 코딩하는 것만 큼은 힘들지만, 지금까지 내가 얻는 데는 약 3 시간이 걸렸다. – Cyril

+0

Okay 버튼에 "응용 프로그램 정의 또는 개체 정의 오류"라는 오류가 발생하여 문제가 발생했습니다. 코드로 들어가면 OptionButton1을 선택한 경우 [Cells ... = 1], OptionButton2를 선택한 경우 [Cells ... = 0.5]가 강조 표시됩니다. 각 항목에 대해 괄호 안의 값을 "ComboBox1.text"로 변경 한 후 이것이 왜 발생하는지 파악할 수 없습니다. – Cyril

관련 문제