Giúp tôi sửa công thức tìm kiếm dữ liệu

Liên hệ QC

trangroitrenmoi

Thành viên mới
Tham gia
14/9/08
Bài viết
8
Được thích
0
Tôi có 1 bảng số liệu như sau, tôi trực tổng đài nên phải nhận máy điện thoại báo hỏng, sau đó in thành phiếu theo từng vùng cho công nhân sửa đường dây đi sửa, tôi đã làm bàng công thức như trong sheet "inphieu" như sau: nếu nhập số máy báo hỏng vào cộtC thì cột D,E,F sẽ hiện ra thông tin của thuê bao đó,nếu ở cột B nhập là "adsl" thỉ cột D sẽ hiện acount,nếu là"adsl+" thì hiện Cáp gốc, cáp ngọn và acount, nếu là h thì hiện cáp gốc,cổng,acount. Bây giờ tôi muốn dùng VBA để thay công thức và thêm 2 yêu cầu nữa là: các máy ở cột c sẽ được sắp xếp theo địa chỉ tức là theo xã sau đó đến thôn,mỗi khi nhập thêm số máy mới vào cột C thì nó sẽ lại đc sắp xếp vào vùng địa chỉ tương ứng,nếu nhập số máy đã được sửa rồi vào cột A thì số máy đó và thông tin của nó ở cột C sẽ bị xoá, nếu nhập sai số máy thì báo lỗi và nhập lại. Tôi mới học VBA nên không biết làm như thế nào, mong các bạn chỉ giúp! Cám ơn nhiều! do không gửi được file đính kèm nên tôi viết ra đây mong các bạn giúp đỡ!
 

File đính kèm

Lần chỉnh sửa cuối:
Chắc bạn phải tách bài toán này ra làm nhiều bài khác nhau;
Ví dụ
Bài 1: Thay công thức đã có bằng cách làm macro - VBA
Nếu đồng ý như vậy, bạn tìm xem có ai sẵn lòng giúp bạn đưa file lên không; Nhưng nên là file giả lập với đủ các tình huống có khả năng diễn ra trong thực tiển!
: ChanhTQ@Yahoo,com

--=0&&&%$R:=\+--=--:-=:-=:-=:-=
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
nếu là"adsl+" thì hiện Cáp gốc, cáp ngọn và acount,
Vậy bạn cho biết cáp ngọn ở nơi mô?
nếu là h thì hiện cáp gốc,cổng,acount. .
Cổng là nơi nào vậy?
Còn nữa, trong trường [Cáp] gồm cả trường [Đôi], sao bạn không có lời nào trong hướng dẫn thì sao mà chịu nổi!

Bạn phải biết rằng nên viết cho người khác hiểu, chứ không phải viết những cái mình hiểu! Càng không nên, là những cái mình đã hiểu thì người khác phải hiểu!
 
Cám ơn các bạn đã góp ý! Mong các bạn thông cảm do tôi mới gia nhập diễn đàn nên còn nhiều sơ xuất.Công thức thì tôi đã làm được rồi,trong file tôi gửi lên đã rõ ràng và đầy đủ rồi đấy chứ. Các bạn chỉ cần vào sheet inphieu,đánh số máy 3660003 vào cột C sau đó lần lượt đánh từ h,adsl,adsl+, và bỏ trống sẽ hiểu rõ thôi, nhưng tôi muốn thay công thức bằng VBA và thêm 2 yêu cầu nữa là: Trong sheet inphieu các máy ở cột c sẽ được sắp xếp theo địa chỉ tức là theo xã sau đó đến thôn,mỗi khi nhập thêm số máy mới vào cột C thì nó sẽ lại đc sắp xếp vào vùng địa chỉ tương ứng,nếu nhập số máy đã được sửa rồi vào cột A thì số máy đó và thông tin của nó ở cột C sẽ bị xoá, nếu nhập sai số máy thì báo lỗi và nhập lại.
 
. . . Công thức tôi đã làm được rồi, file tôi gửi lên đã rõ ràng và đầy đủ rồi đấy chứ.
Rõ ràng là tầm bậy mà, này nhé:
* Trong trang CSDL tên trường là [Cáp trung gian]; Nhưng trong đề bài bạn lại nêu cáp ngọn (?) - Mình phải mất 3 giờ mới tìm ra!
* Trong 'InPhieu' có ghép trường [Đôi] vô ngay đầu cột 'D'; nhưng trong câu hỏi/đề bài bạn có đề cập đến đâu?
* Trong đề bài có nói cổng; nhưng trong 'CSDL' có đề trường nào là [Cổng] đâu kia chứ(?) - Mình phải mất thêm 2 g nữa mới tìm ra trường này(!) - Bạn thấy có tội nghiệp cho mình không kia chứ!

Thật rất nản với bạn; Hay thường ngày bạn hay nói một đường làm một nẽo, nên mới vậy!
Mình định bỏ đi mấy lần rồi. Nhưng quyết tìm cho ra lỗi của bạn như trên; Để nhắn với bạn 1 điều: Trong công việc phải nghiêm túc hơn!
Về chuyên môn excel: Trong công thức bạn nên dùng tên để công thức trống trãi & nghía thuận tiện; VD Mình gán CSDL cho vùng =dulieucoso!$A$2:dulieucoso!$I$15982
Lúc đó công thức cột 'D' chỉ là:
=IF(AND(C6>0;B6<>"adsl");VLOOKUP(C6;CSDL;2;0);IF(AND(B6>0;B6="adsl");VLOOKUP(C6;CSDL;8;0);""))&IF(AND(C6>0;B6<>"adsl");"/";"")&IF(AND(C6>0;B6<>"adsl");VLOOKUP(C6;CSDL;3;0);"")&IF(AND(B6<>"adsl";C6>0);",";"")&IF(AND(C6>0;B6<>"adsl";B6<>"h");VLOOKUP(C6;CSDL;4;0);"")&IF(AND(C6>0;B6="adsl+");",☻";"")&IF(AND(C6>0;OR(B6="h";B6="adsl+"));VLOOKUP(C6;CSDL;8;0);"")&IF(AND(C6>0;OR(B6="h";B6="adsl+"));"/";"")&IF(AND(C6>0;B6="h");VLOOKUP(C6;CSDL;9;0);"")
 
Lần chỉnh sửa cuối:
Sắp hoàn thành rồi đây

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 On Error Resume Next
 
 If Not Intersect(Target, Columns("C:C")) Is Nothing Then
   Dim Rng As Range, cRng As Range:       Dim StrD As String
 
   Set cRng = Sheets("dulieucoso").Columns("A:A")
   StrD = "GPE.COM"
   Set Rng = cRng.Find(what:=Target.Value, LookIn:=xlValues, lookat:=xlWhole)
   If Rng Is Nothing Then
      MsgBox "Chua Co So Nay" & Chr(10) & "DE NGHI NHAP LAI!", , StrD
      Exit Sub
   Else
      StrD = Rng.Offset(, 1) & "/"
      Select Case UCase(Target.Offset(, -1))
      Case "ADSL+"
         StrD = StrD & Rng.Offset(, 2) & Rng.Offset(, 3) & Rng.Offset(, 7)
      Case "ADSL"
         StrD = Rng.Offset(, 7)
      Case "H"
         StrD = StrD & Rng.Offset(, 8) & Rng.Offset(, 7)
      Case Else
         StrD = StrD & Rng.Offset(, 2) & Rng.Offset(, 3)
      End Select
   End If
   With Target
      .Offset(, 1) = StrD:                .Offset(, 2) = Rng.Offset(, 4)
      .Offset(, 3) = Rng.Offset(, 5):     .Offset(, 4) = Rng.Offset(, 6)
 
   End With
 End If
 Application.ScreenUpdating = False:      XepTheoXaThon
 [c65500].End(xlUp).Offset(1).Select
End Sub
Mã:
[B]Sub XepTheoXaThon()[/B]
    Columns("A:G").Select
    Range("G1").Activate
    Selection.Sort Key1:=Range("G2"), Order1:=xlAscending, Key2:=Range("F2") _
        , Order2:=xlAscending, Header:=xlYes, OrderCustom:=1
[B]End Sub[/B]
Câu này chưa hiểu lắm nên chưa thực hiện:
nếu nhập số máy đã được sửa rồi vào cột A thì số máy đó và thông tin của nó ở cột C sẽ bị xoá,
 

File đính kèm

Xin lỗi bạn ChanhTQ@ vì đã làm bạn mất nhiều thời gian như vậy, vì tôi cứ nghĩ là tôi hiểu nên mọi người cũng hiểu nên mới như vậy, thật sự tôi thấy áy náy quá! Cũng cảm ơn hai bạn ChanhTQ@ và HYen17 đã bỏ công sức và thời gian giúp tôi giải quyết xong bài toán này! Cám ơn các bạn nhiều lắm!
 
Tôi sẽ nói rõ hơn về phần tôi chưa nói rõ mà bạn HYen17 không hiểu. Ví dụ khi thuê bao báo hỏng máy điện thoại là 3660003 tôi phải nhập số máy đó vào cột C trong sheet inphieu, nó sẽ hiện thông tin về máy đó ở cột D,E,F,G như bạn đã làm rồi, nếu sau đó lại nhập số máy 3660003 vào cột A(tức là khi công nhân đường dây đã sửa xong số này và báo về cho tôi thì tôi phải nhập số máy đóvào cột A) thì số 3660003 ở cột C sẽ bị xóa bỏ và thông tin tương ứng ở cột D,E,F,G cũng bị xóa luôn. Mong các bạn giúp đỡ!
 
Tôi sẽ nói rõ hơn về phần mà bạn HYen17 chưa hiểu:
Ví dụ khi thuê bao báo hỏng máy điện thoại là 3660003 tôi phải nhập số máy đó vào cột C trong sheet inphieu, nó sẽ hiện thông tin về máy đó ở cột D,E,F,G như bạn đã làm rồi;
Nếu sau đó lại nhập số máy 3660003 vào cột A(tức là khi công nhân đường dây đã sửa xong số này và báo về cho tôi thì tôi phải nhập số máy đóvào cột A) thì số 3660003 ở cột C sẽ bị xóa bỏ và thông tin tương ứng ở cột D,E,F,G cũng bị xóa luôn. Mong các bạn giúp đỡ!
Số máy đã sửa xong này chỉ là một, nhưng nó có thể cao nhất có 4 dòng đang tồn tại & cùng sửa chữa;
Vậy bạn phải xóa dòng (chứa không phải cột như bạn nói trên!) nào; Theo mình nghỉ, bạn phải xóa đúng dòng ADSL, khi nhóm SC báo về đã sửa xong cái ni, phải không? (Trong khi đó cái máy đó cũng đang sửa cái anh 'H' gì đó thì chưa xong mà!). Thông cảm ngoài ngành không rành, có sai ráng chịu khó đọc & giải thích dùm)

Theo như yêu cầu của bạn hiện nay, ta cũng không cần đến macro đâu, ta lấy ô nào đó như [A2] chẳng hạn, nhập SĐThoại vô đó, dùng menu Edit tìm kiếm;
Riết rồi bạn chuyển qua thu 1 macro để tìm; Lúc đó bạn tự thấy thích thú vì đã sáng tạo ra đứa con tinh thần cho riêng bạn!
Hãy vui vẻ với những đứa con sắp có của bạn!
 
Nếu mà tìm kiếm như bình thường thì lâu lắm(vì tổng đài tôi có hơn 10000 thuê bao thoại,hơn 2000 thuê bao adsl), tôi muốn làm thế nào cho dễ dùng nhất vì ở chỗ tôi có nhiếu bác già lắm rồi nên không thành thạo excel lắm. Mà đúng mà bạn hiểu nhầm rồi. Phần đánh vào cột B là hiện tượng hỏng của số máy đó, ví dụ adsl có nghĩa là hỏng mạng không truy cập đươc internet ,nhưng điện thoại vẫn gọi được,nên phải hiện ra thông tin về acount truy cập của số máy đê nhóm sửa chữa đi sửa(bạn dùng mạng nào vậy? của VNPT hay FPT? acount đó chính là username để bạn vào mạng đấy), adsl+ : là hỏng cả mạng và cả tín hiệu thoại nữa nên phải hiện cả hành trình cáp, "H" thì chỉ để tôi xem thông tin của thuê bao đó để kiểm tra trong tổng đài mà thôi, ngoài ra còn hiện tường "chập" ,"hm", ù,rào.....Nói túm lại là nhập gì vào Cột B ngoại trừ "adsl+","adsl","H", thì cũng hiện hết thông tin của thuê bao đó như đã làm, và không có chuyện là một maý báo hỏng lại được nhập nhiều dòng đâu, và ở cột B thì chỉ ghi hiện tượng hỏng đặc trưng nhất thôi, nhóm đi sữa thì phải sữa hết các hiện tượng thì mới báo về là đã sửa xong. Tôi còn muốn khi nhập số máy báo hỏng mới vào cột C nếu đã có số máy rồi thì thông báo là đã có và yêu cầu nhập lại! Bạn có thể giúp tôi nữa được không?
 
Lần chỉnh sửa cuối:
Mình sửa lại mảcro trên lại như sau

Chú ý:
(+) Các dòng lệnh có quýnh số là thêm mới;
(+) Các dòng lệnh mà cuối dòng có mũi tên là có thay chỗ so với trước kia.
(+) Thỏa mãn yêu cầu phụ trội của bạn luôn rồi nha, từ dòng 5 đến dòng 9

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 On Error Resume Next
 Dim Rng As Range, cRng As Range:         Dim StrD As String '<<=='
 
 If Not Intersect(Target, Columns("C:C")) Is Nothing Then
5   Set cRng = Range([c2], Target.Offset(-1))
6   Set Rng = cRng.Find(what:=Target.Value, LookIn:=xlValues, lookat:=xlWhole)
7   If Not Rng Is Nothing And Rng <> Target Then
8      MsgBox "Thue Bao Da Co!":           Exit Sub
9   End If
 
   Set cRng = Sheets("dulieucoso").Columns("A:A")
   Set Rng = cRng.Find(what:=Target.Value, LookIn:=xlValues, lookat:=xlWhole)
   StrD = "GPE.COM"
   If Rng Is Nothing Then
      MsgBox "Chua Co So Nay" & Chr(10) & "DE NGHI NHAP LAI!", , StrD
      Exit Sub
   Else
      StrD = Rng.Offset(, 1) & "/"
      Select Case UCase(Target.Offset(, -1))
      Case "ADSL+"
         StrD = StrD & Rng.Offset(, 2) & Rng.Offset(, 3) & Rng.Offset(, 7)
      Case "ADSL"
         StrD = Rng.Offset(, 7)
      Case "H"
         StrD = StrD & Rng.Offset(, 8) & Rng.Offset(, 7)
      Case Else
         StrD = StrD & Rng.Offset(, 2) & Rng.Offset(, 3)
      End Select
   End If
   With Target
      .Offset(, 1) = StrD:                .Offset(, 2) = Rng.Offset(, 4)
      .Offset(, 3) = Rng.Offset(, 5):     .Offset(, 4) = Rng.Offset(, 6)
   End With
   Application.ScreenUpdating = False:      XepTheoXaThon   '<<=='
   [c65500].End(xlUp).Offset(1).Select                      '<<=='
1 ElseIf Not Intersect(Target, Union([a2], [a20], [a40])) Is Nothing Then
2   Set cRng = Columns("C:C")
3   Set Rng = cRng.Find(what:=Target.Value, LookIn:=xlValues, lookat:=xlWhole)
4   If Not Rng Is Nothing Then Rng.EntireRow.Delete
 End If
End Sub
 
Tôi đã copy đoạn mã của bạn vào file của tôi và chạy thử, nhưng cứ nhập số nào vào cột c thì nó cũng hiện msgbox: "thuê bao da co" và khi nhập số máy đã sửa vào cột a thì số máy ở cột c cũng không bị xóa. Sau đó tôi xóa bỏ phần 'and Rng <>target' ở dòng bạn đánh số 7 thì mới đúng nhưng vẫn chưa xóa được số máy đã sửa.Sau vụ này, nhờ có bạn tôi mới hơi hơi hiểu về VBA, nhưng để làm được như bạn thì còn lâu lắm.Tôi và mấy bác già ở cơ quan rất cảm ơn bạn, mong bạn giúp đỡ nốt nhé!
 
Web KT

Bài viết mới nhất

Back
Top Bottom