Chuyên mục xử lý, gỡ rối code VBA (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Status
Không mở trả lời sau này.

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,957
Em có dữ liệu đầu vào là A1, A2, B1, B2, C, D1, D2, E1, E2, F1, F2, F3, G1, G2. Em cần tách làm 2 trường hợp từ A1 - E2 và từ F1 - G2.
Em sử dụng Select Case như nhau:
PHP:
Select Case R_4.Value
Case "A1" Or "A2" Or "B1" Or "B2" Or "C" Or "D1" Or "D2"                     
            If R_1.Value = "CU" Then                    
                Select Case R_3.Value
                    Case 2
                        cData = .Range("A4:H20").Value   
                    Case 3
                        cData = .Range("K4:R20").Value   
                End Select
            Else                                        
                Select Case R_3.Value
                    Case 2
                        cData = .Range("A21:H36").Value   
                    Case 3
                        cData = .Range("K21:R36").Value   
                End Select
            End If
Case Else                                       
If R_1.Value = "CU" Then
               cData = .Range("A8:H27").Value           
           Else
               cData = .Range("A28:H46").Value          
           End If
End Select

Chạy thì báo lỗi, em đoán là do Case của em không đúng, nhưng không biết sửa như thế nào?
 
Upvote 0
@ChanhTQ: mỗi người có một phong cách viết code khác nhau mà bạn, nhưng càng ngắn ngọn, xúc tích, nghĩa rõ ràng càng tốt. chứ ko nhất thiết phải theo ai.
Dim Arr(), Sh As Object, Rng As Range
Dim J as long, Rws As Long
Dim StrC As String
Bạn đưa ra ví dụ ở trên, nói thật mình chưa thấy ai dùng phong cách khai báo biến như bạn, chắc đó là phong cách của bạn thôi. Thường mình thấy mọi người khai báo biến dùng định dạng lạc đà (camel), còn hàm thì dùng kiểu pascal...
Đúng là mỗi người có 1 cách viết, nhưng cách viết nào rõ ràng, tường minh thì dễ kiểm soát hơn rất nhiều so với cách viết không tường minh, không phải ngắn gọn là tối ưu đâu nha bạn," cái này bạn sẽ biết rõ nếu bạn đã học lập trình cơ sở", kiến thức thực hành là kinh nghiệm thực tiễn, nên những thành viên gạo cội ở đây khuyên thì bạn nên nghĩ lại mà học hỏi, tôi chỉ nói như vậy thôi, học hỏi hay không tùy bạn
 
Upvote 0
Em có dữ liệu đầu vào là A1, A2, B1, B2, C, D1, D2, E1, E2, F1, F2, F3, G1, G2. Em cần tách làm 2 trường hợp từ A1 - E2 và từ F1 - G2.

tách 2 trường hợp thì làm như thế này xem sao
PHP:
Select Case Range("a1").Value

Case "A1" To "C2", "E1" To "F1"     
 .............
Case Else
   .................
End Select
 
Lần chỉnh sửa cuối:
Upvote 0
tách 2 trường hợp thì làm như thế này xem sao
PHP:
Select Case Range("a1").Value

Case "A1" To "F1"
      .............
Case Else
   .................
End Select


Case "A1" To "F1" thì nó có bao gồm F1 ko nhỉ? VBA nhận biết được thứ tự A1, A2, B1, B2 hả bác? Em tưởng nó là kiểu ký tự nên phải kê hết ra

Còn nếu 2 trường hợp lại là D1, D2 và phần còn lại (tách ở giữa) thì viết như thế nào bác phihndhsp
 
Lần chỉnh sửa cuối:
Upvote 0
bạn xem lại bài 488 nha, vì tôi không đọc kỹ đề là thằng D1 và D2 tách riêng
 
Upvote 0
Đúng là mỗi người có 1 cách viết, nhưng cách viết nào rõ ràng, tường minh thì dễ kiểm soát hơn rất nhiều so với cách viết không tường minh, không phải ngắn gọn là tối ưu đâu nha bạn," cái này bạn sẽ biết rõ nếu bạn đã học lập trình cơ sở", kiến thức thực hành là kinh nghiệm thực tiễn, nên những thành viên gạo cội ở đây khuyên thì bạn nên nghĩ lại mà học hỏi, tôi chỉ nói như vậy thôi, học hỏi hay không tùy bạn

Bác ChanhTQ khi nói hàm TraCuu đó là cách đặt tên hỗn hợp cả chữ hoa và chữ thường, đó cũng là cách đặt tên kiểu lạc đà hay kiểu Pascal như bạn duongca đã viết nhưng ví dụ ở dưới của bác Chanh thì lại không như vậy. Cách viết này cũng có thể phối hợp với đặt tên kiểu Hungary nữa.
 
Upvote 0
Báo lỗi ở .Range

11.JPG
Em viết bị lỗi như trên, không biết là bị làm sao...
Module 1 của em cũng dùng cấu trúc như này, nhưng để tính chọn dây nên phải chọn theo sheet, chạy OK
Em viết thêm Module 2 để hiệu chỉnh theo nhiệt độ, chỉ chọn dữ liệu trong 1 sheet nên em để tData = .Range("B_52_14_15!E4:G19").Value không hiểu sao lại bị lỗi #VALUE!

PS: GPE viết cmt thi thoảng cứ bị đẩy lên đầu dòng khi gõ dấu là bị sao nhỉ :3
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
View attachment 155953
Em viết bị lỗi như trên, không biết là bị làm sao...
Module 1 của em cũng dùng cấu trúc như này, nhưng để tính chọn dây nên phải chọn theo sheet, chạy OK
Em viết thêm Module 2 để hiệu chỉnh theo nhiệt độ, chỉ chọn dữ liệu trong 1 sheet nên em để tData = .Range("B_52_14_15!E4:G19").Value không hiểu sao lại bị lỗi #VALUE!

PS: GPE viết cmt thi thoảng cứ bị đẩy lên đầu dòng khi gõ dấu là bị sao nhỉ :3
tData = .Range("B_52_14_15!E4:G19").Value
Cấu trúc không đúng nha bạn
tData = sheets("B_52_14_15").range("E4:G19").VALUE
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn sử dụng cấu trúc sai
Case "D1", "D2"

Thanks bác Phihndhsp!

Em gặp phải trường hợp chia case như hình đính kèm
“Hệ thống máng cáp có đục lỗ nằm ngang” – “Hệ thống máng cáp có đục lỗ thẳng đứng”
VBA không hỗ trợ tiếng việt có dấu, mà sheet nhập của em sử dụng Data Valadition chọn trong list các trường hợp này.
Em cũng tham khảo Cách đánh TIẾNG VIỆT (Có dấu) trong cửa số soạn thảo VBA thì thấy nó hơi phức tạp.
 

File đính kèm

  • 11.JPG
    11.JPG
    78.8 KB · Đọc: 56
Lần chỉnh sửa cuối:
Upvote 0
Em có 1 data gồm các cột :life number, policy number, inception date, sum assured, risk type. Có 5 loại risk type mỗi một life number có thể có 1 hoặc nhiều risk type. Giờ em muốn copy những dòng life number có cùng risk type mà tổng sum assured lớn hơn 800 triệu với điều kiện tháng inception date được cộng dồn. Tức là inception date bắt đầu từ tháng 12/2014 sẽ copy data của những life number có cùng 1 risk type trong tháng 12 mà tổng sum lớn hơn 800 là 1 kết quả. Sau đó, đến tháng 1/2015 có thể life number của tháng 12 /2014 sẽ xuất hiện lại ở tháng 1 thì phải lấy lại những dòng đó với điều kiện như trên và copy hết vào tháng 1. Có thể có những life chưa xuất hiện trong sheet kết quả của tháng 12 nhưng đến tháng 1 lại có vì lúc này tổng tiền cộng dồn trên 1 risk của life này đã lớn hơn 800 vì tháng 1 có phát sinh thêm cùng risk đó.
Mình làm mới 1 trang tính thôi; để bạn kiểm tra số liệu;
Sau đó chúng ta sẽ tiếp với fần giống tương đương
 

File đính kèm

Upvote 0
@phihndhsp bạn không nhìn và đọc kỹ ah, quên là mình nói càng ngắn gọn, xúc tích càng tốt ah, hơn nữa bạn quên là còn có chú thích trong mã nguồn, description cho những method khi đã biên dịch. Phong cách lập trình là của mỗi ng, của cty hay nơi làm việc, tốt nhất cho mình thì dùng nhé. Bạn nên nhớ thành viên gạo cội chưa chắc đã cho lời khuyên tốt nhé.

@Còn những bạn nào đang bắt đầu lập trình, các bạn nên đọc cuốn sách hay và kinh điển này nhé 'Code complete' của 1 chuyên gia đến từ Microsoft.
 
Lần chỉnh sửa cuối:
Upvote 0
@Hau151978 , viết theo kiểu Hungary , mình thấy lập trình viên của Microsoft C++/API rất hay dùng, nó rất ý nghĩa. thấy đội FPT cũng hay dùng.
 
Upvote 0
Mình làm mới 1 trang tính thôi; để bạn kiểm tra số liệu;
Sau đó chúng ta sẽ tiếp với fần giống tương đương

Mình cám ơn bạn nhưng kết quả ở sheets "12-2014" trả ra chưa đúng với kết quả mình mong muốn.

Kết quả mong muốn là:
- tại sheets "12-2014" chỉ có các dòng có sum assured lớn hơn 800 hoặc tổng các hợp đồng cùng 1 life cùng 1 risk có sum assured lớn hơn 800 CỦA THÁNG 12 thì được xuất hiện. trong sheets kết quả bạn hiện ra có cả những tháng khác của năm 2015.
- tại các sheets tiếp theo như "1-2015","2-2015","3-2015",....."12-2015", tương tự quy tắc như trên nhưng lấy lại cả những dòng của tháng 12 nữa. và nếu life nào tháng 12 chưa xuất hiện do sum assured chưa đủ 800 mà đến tháng 1 life này xuất hiện thêm risk nào đó làm cho sum assured trên 800 thì sẽ ghi nhận cả tháng 12 và tháng 1. Những tháng sau nó chưa ghi vào

cám ơn bạn
 
Upvote 0
Nhờ các sư phụ chỉ giúp cách tìm kiếm không chỉ 1 giá trị trong GtriTK ah:
Em muốn GtriTK = "519101" và "519103" và "519106" mà ko biết sửa code sau như thế nào ah?

Sub CopyRow_519101_103_106()
Dim tenWsVBA, tenWs As String
tenWsVBA = ActiveSheet.CodeName
tenWs = ActiveSheet.Name


Dim Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name = "Sheet1n" Then
Ws.Select​
End If​
Next

Dim rng As Range, GtriTK As String
GtriTK = "519101"
With Worksheets(tenWs).Range("B1:B" & Range("B1000").End(xlUp).Row)
Set rng = .Find(GtriTK, LookIn:=xlValues)
If Not rng Is Nothing Then rng.Activate
ActiveCell.EntireRow.Select
'ActiveCell.EntireRow.Interior.ColorIndex = 8
Selection.Copy​
End With​
End Sub
Thanks. Em đã tìm ra giải pháp.
 
Lần chỉnh sửa cuối:
Upvote 0
Untitled.jpg
Sau khi gán marco, save lại thì báo lỗi như hình là sao vậy các bác. Nhấn Yes, tắt file mở lại thì mất hết marco. Chân thành cảm ơn.
 
Upvote 0
Upvote 0
Em có 2 ô sử dụng Data Validation [B1] và [B5],
khi [B1] có giá trị E1 hoặc E2 thì [B5] có giá trị "Touching" hoặc "Spaced".
Khi [B1] ko có giá trị E1, E2 như trên thì ô [B5] vẫn lưu giá trị trước đó, và ko chọn được list.

Em thêm vào hàm IF trong Data Validation
PHP:
 =IF(OR($B$1="E1",$B$1="E2"),GPE!$E$28:$F$28,GPE!$G$30)
Thì nó ra list có ô trắng (Blank) nhưng lại không chọn được, không hiểu do bị sao nhưng file khác làm như vậy vẫn chọn được dòng trắng đó. (ý này chỉ là phụ)

Em đang cần ô [B5] tự động blank khi [B1] khác E1, E2
Em thử dòng lệnh VBA theo gợi ý của bác giaiphap:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If (Target.Address = "$B$1") And (Target.Value = "F2") Then [b5].Value = " "
End Sub
không thấy có tác dụng.

Các bác xem có cách nào, khi chọn giá trị khác E1, E2 trong [B1] (giả sử bằng "F2") thì ô [B5] tự động xóa lựa chọn cũ => blank được không ?
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em có hàm như bên dưới, bây giờ em muốn them điều kiện dựa vào Bô phận sản xuất để xác định ngày nghỉ theo từng bộ phận sản xuất.
VD: Bộ phận sản xuất: thì có Ngày công chuẩn sản xuất - Ngày thực tế,
Bộ phận Văn phòng: thì có Ngày công chuẩn Văn phòng - Ngày thực tế,
..........
[NOTE1]Function Thuong(Byval NgayCongThucTe As Single, ByVal DK_Xet As String, Byval MucThuong As Double) Dim NgayNghi As Double
NgayNghi = NgayCongChuan - NgayCongThucTe
' Xac dinh ngay cong chuan dua vao Bo phan san xuat
If NgayNghi >= 14 Then
Thuong = 0
ElseIf NgayCongThucTe <= 20 Then
Select Case DK_Xet
Case Is = "OK"
Thuong = MucThuong
Case Else
Thuong = 0
End Select
ElseIf NgayCongThucTe >= 21 Then
Thuong = MucThuong
Else
Thuong = 0
End If
End Function


[/NOTE1]

Trân trọng cảm ơn
http://www.mediafire.com/download/neu2y77g52gyh0d/Thuong.xlsm
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom