2014-04-27 28 views
5

Jestem programistą C#/.NET, ale nie jestem zbytnio zaznajomiony z programowaniem Excela lub VBA. W przypadku projektu pobocznego mam arkusz kalkulacyjny, który będzie używany przez nietechnicznych użytkowników do wprowadzania danych. Później ten arkusz kalkulacyjny zostanie wyeksportowany do innego formatu za pośrednictwem programu wiersza poleceń C#, który napisałem, aby dane mogły zostać zrzucone do innego systemu.Pola wyboru dla wielu wartości w pojedynczej komórce w Excelu

Potrzebne są wartości danych, które należy wprowadzić dokładnie tak, jak oczekuje program wiersza poleceń, więc błąd użytkownika spowodowany literówką lub nieznacznymi różnicami w sformułowaniach byłby problematyczny. Potrzebuję użytkownika, aby wybrać z możliwych wartości, a nie polegać na tym, że użytkownik wprowadzi poprawną wartość.

Dla kolumn, które mogą mieć tylko jedną wartość w komórce, udało mi się to osiągnąć, korzystając z menu rozwijanego, z którego użytkownik może wybrać. Zrobiłem to za pomocą instrukcji tutaj:

http://office.microsoft.com/en-us/excel-help/insert-or-delete-a-drop-down-list-HP010072599.aspx

Problem polega na tym, mam kilka kolumn, których komórki mogą posiadać wiele wartości, rozdzielając je przecinkami. Na przykład mam kolumnę "Kolor". Wartość komórki w tej kolumnie może być pojedynczym kolorem (np. "Czerwony") lub listą kolorów oddzielonych przecinkami (np. "Czerwony, zielony, niebieski"). Idealnie chciałbym, aby użytkownik mógł kliknąć komórkę i zobaczyć listę pól wyboru, z których mogliby wybrać kolory, a po jej zakończeniu komórka zostanie zaktualizowana o te kolory oddzielone przecinkami.

Jaki jest najlepszy sposób, aby to osiągnąć? Próbowałem googlowania i znalazłem tą metodą:

http://www.contextures.com/excel-data-validation-multiple.html

... który umożliwia wybranie kilka pozycji z rozwijanego menu, ale jest to niewygodne, ponieważ musi być rozwijana ponownie otwarty za każdym razem inny element musi być dodany . Pola wyboru byłyby wygodniejsze. Czy to możliwe, a jeśli tak, to w jaki sposób?

Odpowiedz

1

Excel ma funkcjonalność dla Userformów, które są podobne do typu projektu WinForms .NET i działają bardzo podobnie. Z edytora kodu w programie Excel kliknij prawym przyciskiem myszy folder modułu w oknie eksploratora i dodaj formularz użytkownika. Projektant pokaże, że jest podobny (choć nie tak krzykliwy) do tego w VS2013. Formularze są również uruchamiane przez system typu zdarzenia.

Możesz zadzwonić do swojej postaci użytkownika z dowolnego podsieci z numerem formName.Show.

Stamtąd zaimplementuj ograniczenia wprowadzania danych i wymyśl dane wejściowe w łańcuchu potrzebnym dla komórki.

Powodzenia!

Dodano: Prawdopodobnie będziesz chciał ustawić zdarzenie arkusza roboczego, gdy określone komórki zostaną uaktywnione, aby otworzyć formularz. W ten sposób po prostu klikają komórkę, zamiast niczego uruchamiać.

7

Spróbuj tego:

Option Explicit 
Dim fillRng As Range 
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

Dim LBColors As MSForms.ListBox 
Dim LBobj As OLEObject 
Dim i As Long 

Set LBobj = Me.OLEObjects("LB_Colors") 
Set LBColors = LBobj.Object 

    If Not Intersect(Target, [B2]) Is Nothing Then 
     Set fillRng = Target 
     With LBobj 
      .Left = fillRng.Left 
      .Top = fillRng.Top 
      .Width = fillRng.Width 
      .Visible = True 
     End With 
    Else 
     LBobj.Visible = False 
     If Not fillRng Is Nothing Then 
      fillRng.ClearContents 
      With LBColors 
       If .ListCount <> 0 Then 
        For i = 0 To .ListCount - 1 
         If fillRng.Value = "" Then 
          If .Selected(i) Then fillRng.Value = .List(i) 
         Else 
          If .Selected(i) Then fillRng.Value = _ 
           fillRng.Value & "," & .List(i) 
         End If 
        Next 
       End If 
       For i = 0 To .ListCount - 1 
        .Selected(i) = False 
       Next 
      End With 
      Set fillRng = Nothing 
     End If 
    End If 

End Sub 

W powyższym kodzie użyłem OleObject typu MsForm.Listbox.
Najpierw skonfigurowano numer Listbox OleObject, który został omówiony pod numerem HERE.
W powyższym kodzie nazwałem mój Listbox jako, który można zmienić, uzyskując dostęp do jego właściwości.

Załóżmy skonfigurować swoje dane jak poniżej:

enter image description here

Powyższy kod wykonywany po dokonaniu wyboru.
Jeśli wybór jest równy B2, zostanie wyświetlony obiekt utworzony ListBox.

enter image description here

Ustalamy ListBox pozycji obiektów (z lewej, u góry), a szerokość równa B2 tak będzie wyglądał jak kropla w dół.
Użytkownik może następnie wybrać wartości.

enter image description here

Gdy użytkownik jest już zadowolony z wyboru, po prostu kliknij poza ListBox.
Wybór zostanie wpisany w B2, a ListbBox będzie niewidoczny ponownie, jak widać poniżej.

enter image description here

Czy to, co próbujesz?

+0

Wow, to naprawdę dobra instrukcja. Poszedłem za nim i wygląda na to, że działa ładnie. Chociaż zastanawiałem się nad jedną niezręczną rzeczą. Ilekroć wybieram komórkę, oryginalne przedmioty są usuwane (nawet jeśli nic nie zrobiłem). Czy jest to szybkie i łatwe, aby to przynajmniej nie usunęło się, poruszając kursorami? –

+0

@ThomasCheng Spróbuj usunąć drugą 'For Loop'. – L42

Powiązane problemy