2014-04-27 47 views
5

Tôi là nhà phát triển C# /. NET nhưng không quá quen thuộc với lập trình Excel hoặc VBA. Đối với một dự án phụ, tôi có một bảng tính sẽ được người dùng phi kỹ thuật sử dụng để nhập dữ liệu. Sau đó bảng tính này sẽ được xuất sang một định dạng khác thông qua chương trình dòng lệnh C# mà tôi đã viết để dữ liệu có thể được đổ vào một hệ thống khác.Hộp kiểm cho nhiều giá trị trong một ô trong Excel

Tôi cần các giá trị dữ liệu được nhập chính xác vì chương trình dòng lệnh sẽ trông đợi chúng, do đó lỗi người dùng do lỗi chính tả hoặc sự khác biệt về từ ngữ nhỏ sẽ là vấn đề. Tôi cần người dùng chọn từ các giá trị có thể thay vì dựa vào người dùng để nhập giá trị chính xác.

Đối với các cột chỉ có thể có một giá trị trong một ô, tôi có thể thực hiện việc này bằng cách sử dụng menu thả xuống mà từ đó người dùng có thể chọn. Tôi đã làm điều này thông qua các hướng dẫn tại đây:

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

Vấn đề là, tôi có nhiều cột mà tế bào có thể chứa nhiều giá trị, cách nhau bằng dấu phẩy. Ví dụ: tôi có cột "Màu". Giá trị của một ô trong cột này có thể là một màu duy nhất (ví dụ: "Màu đỏ") hoặc danh sách các màu được phân tách bằng dấu phẩy (ví dụ: "Đỏ, Xanh lục, Xanh lam"). Lý tưởng nhất là tôi muốn người dùng có thể nhấp vào ô và xem danh sách các hộp kiểm mà từ đó họ có thể chọn màu sắc và khi hoàn thành, ô sẽ được cập nhật với các màu được phân tách bằng dấu phẩy.

Cách tốt nhất để thực hiện việc này là gì? Tôi đã thử googling và thấy phương pháp này:

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

... cho phép chọn nhiều mục từ menu thả xuống, nhưng đó là bất tiện vì thả xuống phải được mở lại mỗi lần mục khác cần phải được thêm . Hộp kiểm sẽ thuận tiện hơn. Điều này có thể, và nếu có, làm thế nào?

Trả lời

1

Excel có chức năng cho Userforms tương tự như Kiểu dự án WinForms của .NET và chúng hoạt động thực sự giống nhau. Từ trình soạn thảo mã trong excel, nhấp chuột phải vào thư mục mô-đun trong cửa sổ trình khám phá và thêm một Userform. Một nhà thiết kế sẽ cho thấy rằng là tương tự (mặc dù không phải là hào nhoáng) với một trong VS2013. Các biểu mẫu cũng chạy ra khỏi hệ thống kiểu sự kiện.

Bạn có thể gọi cho biểu mẫu người dùng của mình từ bất kỳ phụ nào có số formName.Show.

Từ đó, triển khai các hạn chế đầu vào của bạn và trộn đầu vào vào chuỗi bạn cần cho ô.

Chúc may mắn!

Đã thêm: Có thể bạn sẽ muốn thiết lập sự kiện trang tính khi các ô cụ thể được kích hoạt để mở biểu mẫu. Bằng cách đó, họ chỉ cần nhấp vào ô thay vì phải chạy bất cứ thứ gì.

7

Hãy thử điều này:

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 

Trong đoạn mã trên, tôi đã sử dụng một OleObject loại MsForm.Listbox.
Lần đầu tiên thiết lập Listbox OleObject của bạn đã được thảo luận HERE.
Trong mã trên, tôi đặt tên là ListboxLB_Colors có thể thay đổi bằng cách truy cập các thuộc tính của nó.

Giả sử bạn thiết lập dữ liệu của bạn như dưới đây:

enter image description here

Đoạn mã trên thực hiện khi lựa chọn được thực hiện.
Nếu lựa chọn bằng B2, đối tượng ListBox được tạo sẽ xuất hiện.

enter image description here

Chúng tôi thiết lập các vị trí ListBox đối tượng (trái, phía trên) và chiều rộng bằng B2 vì vậy nó sẽ trông giống như một danh sách thả xuống.
Sau đó, người dùng có thể chọn giá trị.

enter image description here

Khi người dùng đã hài lòng với sự lựa chọn, chỉ cần nhấp ra khỏi ListBox.
Lựa chọn sẽ được viết bằng B2ListbBox sẽ không hiển thị lại như được thấy bên dưới.

enter image description here

Đây có phải là những gì bạn đang cố gắng?

+0

Wow đó là hướng dẫn thực sự tốt. Tôi theo dõi nó và nó có vẻ hoạt động tốt. Mặc dù tôi đã tự hỏi về một điều khó xử. Bất cứ khi nào tôi chọn ô, các mục gốc sẽ bị xóa (ngay cả khi tôi không làm gì cả). Có một sửa chữa nhanh chóng và dễ dàng với điều đó ít nhất để nó sẽ không rõ ràng bằng cách di chuyển con trỏ của tôi xung quanh? –

+0

@ThomasCheng Hãy thử xóa 2nd 'For Loop'. – L42

Các vấn đề liên quan