hiennv.tsc
Thành viên chính thức


- Tham gia
- 13/4/19
- Bài viết
- 51
- Được thích
- 16
Cảm ơn bạn đã quan tâm và giúp đỡ.Đây bạn, phải đọc tin tức coi còn phong toả theo nghị định 16 không đã
Thân
Trong file tôi gởi lên bạn muốn kết quả như thế nào thì nhập vào, chắc mình hông hiểu đề bài, bạn giải thích rõ hơn xem sao, từ hồi có Cô Vy đầu óc nó sao ý. Xem đá banh đã, lúc nào rảnh ...làm tiếpCảm ơn bạn đã quan tâm và giúp đỡ.
Bạn ơi ý của mình không phải là lấy dữ liệu trên range()
Mà các dữ liệu trên là mặc định (cố định)
Mình xin giải thích như sau:Trong file tôi gởi lên bạn muốn kết quả như thế nào thì nhập vào, chắc mình hông hiểu đề bài, bạn giải thích rõ hơn xem sao, từ hồi có Cô Vy đầu óc nó sao ý. Xem đá banh đã, lúc nào rảnh ...làm tiếp
Thân
Cảm ơn bạn @batman1 đã thức khuya giúp đỡ.Tham số cuối cùng có thể nhập RANGE hoặc mảng có 4 dòng (Dòng điều kiện, Dòng cần thay thế 1, Dòng cần thay thế 2, Dòng cần thay thế 3Đ
Cảm ơn bạn @SA_DQCó nghĩa là bạn muốn có 1 hàm tự tạo theo kiểu:
=UDF(MaSo As String, Optional Dong = 1 As Byte) As String
Ví dụ: =UDF ( "12,01,22") => "a6,b6,c6_a1,b1,c1_a10,b10,c10"
& =UDF("03,12,13,33",3) => "a3,b3,c3_a6,b6,c6_a7,b7,c7_a15,b15,c15"
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(J23;01;a1,b1,c1);02;a2,b2,c2);03;a3,b3,c3);10;a4,b4,c4);11;a5,b5,c5);12;a6,b6,c6);13;a7,b7,c7);20;a8,b8,c8);21;a9,b9,c9);22;a10,b10,c10);23;a11,b11,c11);30;a12,b12,c12);31;a13,b13,c13);32;a14,b14,c14);33;a15,b15,c15) |
Vâng đúng rồi bạn!Mình tin là mình đã hiểu đúng ý của bạn, có nghĩa là
Ví dụ: =UDF ( "12,01,22") sẽ trả về dòng đầu tiên: "a6,b6,c6_a1,b1,c1_a10,b10,c10"
& =UDF("03,12,13,33",3) sẽ trả về dòng thứ 3: "a3,b3,c3_a6,b6,c6_a7,b7,c7_a15,b15,c15"
Function UDF(ChuoiTim As String, Optional DongTim As Byte = 1) As String
Dim Rng As Range, sRng As Range
Dim VTr As Byte
ChuoiTim = ChuoiTim & ","
Set Rng = Range([D3], [Az3].End(xlToLeft))
Do
VTr = InStr(ChuoiTim, ","): If VTr < 1 Then Exit Do
Set sRng = Rng.Find(Left(ChuoiTim, VTr - 1), , xlFormulas, xlWhole)
If sRng Is Nothing Then
MsgBox "Nothing!"
Else
UDF = UDF & sRng.Offset(1 + DongTim).Value & "; "
ChuoiTim = Mid(ChuoiTim, 1 + VTr, Len(ChuoiTim))
End If
Loop
End Function
hihi...... bạn @SA_DQ ơi mình nghĩ chắc là vẫn chưa đúng ý của mình rồi.Thử kiểm xem nha:
PHP:Function UDF(ChuoiTim As String, Optional DongTim As Byte = 1) As String Dim Rng As Range, sRng As Range Dim VTr As Byte ChuoiTim = ChuoiTim & "," Set Rng = Range([D3], [Az3].End(xlToLeft)) Do VTr = InStr(ChuoiTim, ","): If VTr < 1 Then Exit Do Set sRng = Rng.Find(Left(ChuoiTim, VTr - 1), , xlFormulas, xlWhole) If sRng Is Nothing Then MsgBox "Nothing!" Else UDF = UDF & sRng.Offset(1 + DongTim).Value & "; " ChuoiTim = Mid(ChuoiTim, 1 + VTr, Len(ChuoiTim)) End If Loop End Function
Function UDF(ChuoiTim As String, Optional DongTim As Byte = 1) As String
Dim Rng As Range, sRng As Range
Dim VTr As Byte
Dòng c?n thay th? 1
01=a1,b1,c1
02=a2,b2,c2
03=a3,b3,c3
10=a4,b4,c4
11=a5,b5,c5
12=a6,b6,c6
13=a7,b7,c7
20=a8,b8,c8
21=a9,b9,c9
22=a10,b10,c10
23=a11,b11,c11
30=a12,b12,c12
31=a13,b13,c13
32=a14,b14,c14
33=a15,b15,c15
Dòng c?n thay th? 2
01=d1,e1,f1
02=d2,e2,f2
03=d3,e3,f3
10=d4,e4,f4
11=d5,e5,f5
12=d6,e6,f6
13=d7,e7,f7
20=d8,e8,f8
21=d9,e9,f9
22=d10,e10,f10
23=d11,e11,f11
30=d12,e12,f12
31=d13,e13,f13
32=d14,e14,f14
33=d15,e15,f15
Dòng c?n thay th? 3
01=g1,i1,k1
02=g2,i2,k2
03=g3,i3,k3
10=g4,i4,k4
11=g5,i5,k5
12=g6,i6,k6
13=g7,i7,k7
20=g8,i8,k8
21=g9,i9,k9
22=g10,i10,k10
23=g11,i11,k11
30=g12,i12,k12
31=g13,i13,k13
32=g14,i14,k14
33=g15,i15,k15
ChuoiTim = ChuoiTim & ","
Set Rng = Range([D3], [Az3].End(xlToLeft))
Do
VTr = InStr(ChuoiTim, ","): If VTr < 1 Then Exit Do
Set sRng = Rng.Find(Left(ChuoiTim, VTr - 1), , xlFormulas, xlWhole)
If sRng Is Nothing Then
MsgBox "Nothing!"
Else
UDF = UDF & sRng.Offset(1 + DongTim).Value & "; "
ChuoiTim = Mid(ChuoiTim, 1 + VTr, Len(ChuoiTim))
End If
Loop
End Function
Nói thật sự với bạn @SA_DQ là mình mù tịt về VBATham khảo từ #12 hay #13 bạn tự sửa đi & mình tin là bạn sẽ sửa được
Nếu như bạn muốn là đưa vô hàm luôn (để bạn khỏi nhập bằng tay tham số đầu của hàm) thì cú pháp chỉ còn là
=UDF(Optional DongDo As Byte= 1)
& đó là 1 hàm thông minh mà mình mới thấy lần đầu trong đời!
Viết thế mà vẫn kêu. Bó tay.=UDF ( "ô chưa")=>"a6,b6,c6_a1,b1,c1_a10,b10,c10"
Ô chưa ="12,01,22"
Nếu là công thức của excel là như ví dụ bên dưới (nhưng không chưa chính xác)
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(J23;01;a1,b1,c1);02;a2,b2,c2);03;a3,b3,c3);10;a4,b4,c4);11;a5,b5,c5);12;a6,b6,c6);13;a7,b7,c7);20;a8,b8,c8);21;a9,b9,c9);22;a10,b10,c10);23;a11,b11,c11);30;a12,b12,c12);31;a13,b13,c13);32;a14,b14,c14);33;a15,b15,c15)
Bạn @batman1 @SA_DQ tức là cho các mã này vào luôn trong UDF
=thaythe("ab";D11;F3:T6)
=thaythe("ab";D11;{"01"\"02"\"03"\"10"\"11"\"12"\"13"\"20"\"21"\"22"\"23"\"30"\"31"\"32"\"33";"a1,b1,c1"\"a2,b2,c2"\"a3,b3,c3"\"a4,b4,c4"\"a5,b5,c5"\"a6,b6,c6"\"a7,b7,c7"\"a8,b8,c8"\"a9,b9,c9"\"a10,b10,c10"\"a11,b11,c11"\"a12,b12,c12"\"a13,b13,c13"\"a14,b14,c14"\"a15,b15,c15";"d1,e1,f1"\"d2,e2,f2"\"d3,e3,f3"\"d4,e4,f4"\"d5,e5,f5"\"d6,e6,f6"\"d7,e7,f7"\"d8,e8,f8"\"d9,e9,f9"\"d10,e10,f10"\"d11,e11,f11"\"d12,e12,f12"\"d13,e13,f13"\"d14,e14,f14"\"d15,e15,f15";"g1,i1,k1"\"g2,i2,k2"\"g3,i3,k3"\"g4,i4,k4"\"g5,i5,k5"\"g6,i6,k6"\"g7,i7,k7"\"g8,i8,k8"\"g9,i9,k9"\"g10,i10,k10"\"g11,i11,k11"\"g12,i12,k12"\"g13,i13,k13"\"g14,i14,k14"\"g15,i15,k15"})
=thaythe("ab";"12,01,22";{"01"\"02"\"03"\"10"\"11"\"12"\"13"\"20"\"21"\"22"\"23"\"30"\"31"\"32"\"33";"a1,b1,c1"\"a2,b2,c2"\"a3,b3,c3"\"a4,b4,c4"\"a5,b5,c5"\"a6,b6,c6"\"a7,b7,c7"\"a8,b8,c8"\"a9,b9,c9"\"a10,b10,c10"\"a11,b11,c11"\"a12,b12,c12"\"a13,b13,c13"\"a14,b14,c14"\"a15,b15,c15";"d1,e1,f1"\"d2,e2,f2"\"d3,e3,f3"\"d4,e4,f4"\"d5,e5,f5"\"d6,e6,f6"\"d7,e7,f7"\"d8,e8,f8"\"d9,e9,f9"\"d10,e10,f10"\"d11,e11,f11"\"d12,e12,f12"\"d13,e13,f13"\"d14,e14,f14"\"d15,e15,f15";"g1,i1,k1"\"g2,i2,k2"\"g3,i3,k3"\"g4,i4,k4"\"g5,i5,k5"\"g6,i6,k6"\"g7,i7,k7"\"g8,i8,k8"\"g9,i9,k9"\"g10,i10,k10"\"g11,i11,k11"\"g12,i12,k12"\"g13,i13,k13"\"g14,i14,k14"\"g15,i15,k15"})
Có cách khác là vùng dữ liệu này được gán 1 cái tên cúng cơm & như vậy trong code ta réo tên cúng cơm nó ra mà mần, Vậy có được không các bạn?. . . . Vùng dữ liệu có thể truyền khi gọi UDF hoặc nhập cứng trong code như bài #14. Nhập cứng thì khi cần thay đổi vùng dứ liệu thì phải sửa trong code. . . . .
Theo tôi dùng cách nào cũng được miễn không ghi cứng trong code. Code lấy D3:AZ3, rồi cứ tìm thấy là dịch xuống 1, 2, 3 dòng tức là lấy D4:AZ4, ..., D6:AZ6 là code có ghi cứng vùng dữ liệu rồi.Có cách khác là vùng dữ liệu này được gán 1 cái tên cúng cơm & như vậy trong code ta réo tên cúng cơm nó ra mà mần, Vậy có được không các bạn?
& nó hay hay dỡ như thế nào, xin nhờ các bạn phân tích tiếp; Rất cảm ơn & trân trọng!
Với hàm của tôi thì tôi đã ghi hết các cách gọi.Cảm ơn bạn @batman1 !
Phương án như này thì tương đối tàm tạm.
Nhưng khi gọi hàm thì lại khó khăn
Mình muốn nó cố định như này cũng được.
nhưng khi gọi hàm thì chỉ cần gõ "=thaythe(ab; thì cái hàm bên dưới của bạn sẽ suất hiện và chỉ cần chọn ô tham chiếu
Vậy kính mong bạn giúp đỡ
=thaythe("ab";D11;{"01"\"02"\"03"\"10"\"11"\"12"\"13"\"20"\"21"\"22"\"23"\"30"\"31"\"32"\"33";"a1,b1,c1"\"a2,b2,c2"\"a3,b3,c3"\"a4,b4,c4"\"a5,b5,c5"\"a6,b6,c6"\"a7,b7,c7"\"a8,b8,c8"\"a9,b9,c9"\"a10,b10,c10"\"a11,b11,c11"\"a12,b12,c12"\"a13,b13,c13"\"a14,b14,c14"\"a15,b15,c15";"d1,e1,f1"\"d2,e2,f2"\"d3,e3,f3"\"d4,e4,f4"\"d5,e5,f5"\"d6,e6,f6"\"d7,e7,f7"\"d8,e8,f8"\"d9,e9,f9"\"d10,e10,f10"\"d11,e11,f11"\"d12,e12,f12"\"d13,e13,f13"\"d14,e14,f14"\"d15,e15,f15";"g1,i1,k1"\"g2,i2,k2"\"g3,i3,k3"\"g4,i4,k4"\"g5,i5,k5"\"g6,i6,k6"\"g7,i7,k7"\"g8,i8,k8"\"g9,i9,k9"\"g10,i10,k10"\"g11,i11,k11"\"g12,i12,k12"\"g13,i13,k13"\"g14,i14,k14"\"g15,i15,k15"})
Rất cảm ơn bạn @batman1 đã quan tâm giúp đỡ.Theo tôi dùng cách nào cũng được miễn không ghi cứng trong code. Code lấy D3:AZ3, rồi cứ tìm thấy là dịch xuống 1, 2, 3 dòng tức là lấy D4:AZ4, ..., D6:AZ6 là code có ghi cứng vùng dữ liệu rồi.
Bài đã được tự động gộp:
Với hàm của tôi thì tôi đã ghi hết các cách gọi.
Tôi không hiểu ý của bạn.
Tôi không hiểu lý do bạn không muốn nhập vùng dữ liệu.
Nếu vùng dữ liệu LUÔN LUÔN cố định thì như bài #14 thôi. Hoặc sửa chút bài của tôi. Nhưng bạn "bĩu môi" với bài #14 nên tôi chả hiểu được ý muốn của bạn.
Tôi đã viết hết ý. Tôi dừng ở đây.
Function UDF(ChuoiTim As String, Optional DongTim As Byte = 1) As String
Dim VTr As Byte
Dim GPE As String
Const D1 As String = "a1,b1,c1": Const E1 As String = "d1,e1,f1": Const F1 As String = "g1,i1,k1" '01 '
Const D2 As String = "a2,b2,c2": Const E2 As String = "d2,e2,f2": Const F2 As String = "g2,i2,k2" '02 '
Const D3 As String = "a3,b3,c3": Const E3 As String = "d3,e3,f3": Const F3 As String = "g3,i3,k3" '03 '
Const DA As String = "a4,b4,c4": Const EA As String = "d4,e4,f4": Const FA As String = "g4,i4,k4" '10 '
Const DB As String = "a5,b5,c5": Const EB As String = "d5,e5,f5": Const FB As String = "g5,i5,k5" '11 '
Const DC As String = "a6,b6,c6": Const EC As String = "d6,e6,f6": Const FC As String = "g6,i6,k6" '12 '
Const DD As String = "a7,b7,c7": Const ED As String = "d7,e7,f7": Const FD As String = "g7,i7,k7" '13 '
Const DE As String = "a8,b8,c8": Const EE As String = "d8,e8,f8": Const FE As String = "g8,i8,k8" '20 '
Const DF As String = "a9,b9,c9": Const EF As String = "d9,e9,f9": Const FF As String = "g9,i9,k9" '21 '
Const DG As String = "a10,b10,c10": Const EG As String = "d10,e10,f10": Const FG As String = "g10,i10,k10" '22 '
Const DH As String = "a11,b11,c11": Const EH As String = "d11,e11,f11": Const FH As String = "g11,i11,k11" '23 '
Const DI As String = "a12,b12,c12": Const EI As String = "d12,e12,f12": Const FI As String = "g12,i12,k12" '30 '
Const DJ As String = "a13,b13,c13": Const EJ As String = "d13,e13,f13": Const FJ As String = "g13,i13,k13" '31 '
Const DK As String = "a14,b14,c14": Const EK As String = "d14,e14,f14": Const FK As String = "g14,i14,k14" '32 '
Const DL As String = "a15,b15,c15": Const EL As String = "d15,e15,f15": Const FL As String = "g15,i15,k15" '33 '
ChuoiTim = ChuoiTim & ","
Do
VTr = InStr(ChuoiTim, ",")
If VTr < 1 Then
Exit Do
Else
GPE = Left(ChuoiTim, VTr - 1)
Select Case DongTim
Case 1
UDF = UDF & "; " & Switch(GPE = "01", D1, GPE = "02", D2, GPE = "03", D3, GPE = "10", DA, GPE = "11", DB _
, GPE = "12", DC, GPE = "13", DD, GPE = "20", DE, GPE = "21", DF, GPE = "22", DG, GPE = "23", DH _
, GPE = "30", DI, GPE = "31", DJ, GPE = "32", DK, GPE = "33", DL)
Case 2
UDF = UDF & "; " & Switch(GPE = "01", E1, GPE = "02", E2, GPE = "03", E3, GPE = "10", EA, GPE = "11", EB _
, GPE = "12", EC, GPE = "13", ED, GPE = "20", EE, GPE = "21", EF, GPE = "22", EG, GPE = "23", EH _
, GPE = "30", EI, GPE = "31", EJ, GPE = "32", EK, GPE = "33", EL)
Case 3
UDF = UDF & "; " & Switch(GPE = "01", F1, GPE = "02", F2, GPE = "03", F3, GPE = "10", FA, GPE = "11", FB _
, GPE = "12", FC, GPE = "13", FD, GPE = "20", FE, GPE = "21", FF, GPE = "22", FG, GPE = "23", FH _
, GPE = "30", FI, GPE = "31", FJ, GPE = "32", FK, GPE = "33", FL)
Case Else
UDF = "Quá Ngu & Cút Ngay!": Exit Function
End Select
ChuoiTim = Mid(ChuoiTim, VTr + 1, Len(ChuoiTim))
End If
Loop
UDF = Mid$(UDF, 3, Len(UDF))
End Function
Cảm ơn sự nhiệt tình giúp đỡ của bạn @SA_DQ!& đây là nổ lực cuối cùng của mình với chủ bài đăng:
PHP:Function UDF(ChuoiTim As String, Optional DongTim As Byte = 1) As String Dim VTr As Byte Dim GPE As String Const D1 As String = "a1,b1,c1": Const E1 As String = "d1,e1,f1": Const F1 As String = "g1,i1,k1" '01 ' Const D2 As String = "a2,b2,c2": Const E2 As String = "d2,e2,f2": Const F2 As String = "g2,i2,k2" '02 ' Const D3 As String = "a3,b3,c3": Const E3 As String = "d3,e3,f3": Const F3 As String = "g3,i3,k3" '03 ' Const DA As String = "a4,b4,c4": Const EA As String = "d4,e4,f4": Const FA As String = "g4,i4,k4" '10 ' Const DB As String = "a5,b5,c5": Const EB As String = "d5,e5,f5": Const FB As String = "g5,i5,k5" '11 ' Const DC As String = "a6,b6,c6": Const EC As String = "d6,e6,f6": Const FC As String = "g6,i6,k6" '12 ' Const DD As String = "a7,b7,c7": Const ED As String = "d7,e7,f7": Const FD As String = "g7,i7,k7" '13 ' Const DE As String = "a8,b8,c8": Const EE As String = "d8,e8,f8": Const FE As String = "g8,i8,k8" '20 ' Const DF As String = "a9,b9,c9": Const EF As String = "d9,e9,f9": Const FF As String = "g9,i9,k9" '21 ' Const DG As String = "a10,b10,c10": Const EG As String = "d10,e10,f10": Const FG As String = "g10,i10,k10" '22 ' Const DH As String = "a11,b11,c11": Const EH As String = "d11,e11,f11": Const FH As String = "g11,i11,k11" '23 ' Const DI As String = "a12,b12,c12": Const EI As String = "d12,e12,f12": Const FI As String = "g12,i12,k12" '30 ' Const DJ As String = "a13,b13,c13": Const EJ As String = "d13,e13,f13": Const FJ As String = "g13,i13,k13" '31 ' Const DK As String = "a14,b14,c14": Const EK As String = "d14,e14,f14": Const FK As String = "g14,i14,k14" '32 ' Const DL As String = "a15,b15,c15": Const EL As String = "d15,e15,f15": Const FL As String = "g15,i15,k15" '33 ' ChuoiTim = ChuoiTim & "," Do VTr = InStr(ChuoiTim, ",") If VTr < 1 Then Exit Do Else GPE = Left(ChuoiTim, VTr - 1) Select Case DongTim Case 1 UDF = UDF & "; " & Switch(GPE = "01", D1, GPE = "02", D2, GPE = "03", D3, GPE = "10", DA, GPE = "11", DB _ , GPE = "12", DC, GPE = "13", DD, GPE = "20", DE, GPE = "21", DF, GPE = "22", DG, GPE = "23", DH _ , GPE = "30", DI, GPE = "31", DJ, GPE = "32", DK, GPE = "33", DL) Case 2 UDF = UDF & "; " & Switch(GPE = "01", E1, GPE = "02", E2, GPE = "03", E3, GPE = "10", EA, GPE = "11", EB _ , GPE = "12", EC, GPE = "13", ED, GPE = "20", EE, GPE = "21", EF, GPE = "22", EG, GPE = "23", EH _ , GPE = "30", EI, GPE = "31", EJ, GPE = "32", EK, GPE = "33", EL) Case 3 UDF = UDF & "; " & Switch(GPE = "01", F1, GPE = "02", F2, GPE = "03", F3, GPE = "10", FA, GPE = "11", FB _ , GPE = "12", FC, GPE = "13", FD, GPE = "20", FE, GPE = "21", FF, GPE = "22", FG, GPE = "23", FH _ , GPE = "30", FI, GPE = "31", FJ, GPE = "32", FK, GPE = "33", FL) Case Else UDF = "Quá Ngu & Cút Ngay!": Exit Function End Select ChuoiTim = Mid(ChuoiTim, VTr + 1, Len(ChuoiTim)) End If Loop UDF = Mid$(UDF, 3, Len(UDF)) End Function
Chưa chắc ai dậy sớm hơn ai. Bạn mở máy tầm 3- 4 giờ thì.....chắc cú giờ đó bạn....đã thức dậy, còn "hôm nào cũng thấy bạn có mặt trên diễn đàn rồi." thì chưa chắc, bác ý mở máy lúc sớm, xỉn rồi ngủ, quên tắt máy ==> bạn nghĩ lầm. HihiCảm ơn sự nhiệt tình giúp đỡ của bạn @SA_DQ!
.....
Mà thường ngày bạn cũng hay dậy sớm ghê, mình mở máy tầm 3-4h hôm nào cũng thấy bạn có mặt trên diễn đàn rồi.
''''''
Thử hàm ABCMình xin giải thích như sau:
Bạn xem lại và giúp đỡ
Cảm ơn bạn!
Function ABC(ByVal iStr$, Optional iLoai& = 1) As String
Dim aDK, aLoai, S, Res(), j&, c&, k&
aDK = ",,,01,02,03,10,11,12,13,20,21,22,23,30,31,32,33,"
aLoai = Array("", "a1,b1,c1", "d1,e1,f1", "g1,i1,k1")
S = Split("," & iStr, ",")
For j = 1 To UBound(S)
c = Int(InStr(1, aDK, "," & S(j) & ",") / 3)
If c > 0 Then
k = k + 1
ReDim Preserve Res(1 To k)
Res(k) = Replace(aLoai(iLoai), "1", c)
End If
Next j
ABC = Join(Res, "; ")
End Function
Cảm ơn bạn @HieuCD đã quan tâm giúp đỡ.Thử hàm ABC
Mã:Function ABC(ByVal iStr$, Optional iLoai& = 1) As String Dim aDK, aLoai, S, Res(), j&, c&, k& aDK = ",,,01,02,03,10,11,12,13,20,21,22,23,30,31,32,33," aLoai = Array("", "a1,b1,c1", "d1,e1,f1", "g1,i1,k1") S = Split("," & iStr, ",") For j = 1 To UBound(S) c = Int(InStr(1, aDK, "," & S(j) & ",") / 3) If c > 0 Then k = k + 1 ReDim Preserve Res(1 To k) Res(k) = Replace(aLoai(iLoai), "1", c) End If Next j ABC = Join(Res, "; ") End Function
Một lần nữa cảm ơn bạn @SA_DQ nhé!& đây là nổ lực cuối cùng của mình với chủ bài đăng:
PHP:Function UDF(ChuoiTim As String, Optional DongTim As Byte = 1) As String Dim VTr As Byte Dim GPE As String Const D1 As String = "a1,b1,c1": Const E1 As String = "d1,e1,f1": Const F1 As String = "g1,i1,k1" '01 ' Const D2 As String = "a2,b2,c2": Const E2 As String = "d2,e2,f2": Const F2 As String = "g2,i2,k2" '02 ' Const D3 As String = "a3,b3,c3": Const E3 As String = "d3,e3,f3": Const F3 As String = "g3,i3,k3" '03 ' Const DA As String = "a4,b4,c4": Const EA As String = "d4,e4,f4": Const FA As String = "g4,i4,k4" '10 ' Const DB As String = "a5,b5,c5": Const EB As String = "d5,e5,f5": Const FB As String = "g5,i5,k5" '11 ' Const DC As String = "a6,b6,c6": Const EC As String = "d6,e6,f6": Const FC As String = "g6,i6,k6" '12 ' Const DD As String = "a7,b7,c7": Const ED As String = "d7,e7,f7": Const FD As String = "g7,i7,k7" '13 ' Const DE As String = "a8,b8,c8": Const EE As String = "d8,e8,f8": Const FE As String = "g8,i8,k8" '20 ' Const DF As String = "a9,b9,c9": Const EF As String = "d9,e9,f9": Const FF As String = "g9,i9,k9" '21 ' Const DG As String = "a10,b10,c10": Const EG As String = "d10,e10,f10": Const FG As String = "g10,i10,k10" '22 ' Const DH As String = "a11,b11,c11": Const EH As String = "d11,e11,f11": Const FH As String = "g11,i11,k11" '23 ' Const DI As String = "a12,b12,c12": Const EI As String = "d12,e12,f12": Const FI As String = "g12,i12,k12" '30 ' Const DJ As String = "a13,b13,c13": Const EJ As String = "d13,e13,f13": Const FJ As String = "g13,i13,k13" '31 ' Const DK As String = "a14,b14,c14": Const EK As String = "d14,e14,f14": Const FK As String = "g14,i14,k14" '32 ' Const DL As String = "a15,b15,c15": Const EL As String = "d15,e15,f15": Const FL As String = "g15,i15,k15" '33 ' ChuoiTim = ChuoiTim & "," Do VTr = InStr(ChuoiTim, ",") If VTr < 1 Then Exit Do Else GPE = Left(ChuoiTim, VTr - 1) Select Case DongTim Case 1 UDF = UDF & "; " & Switch(GPE = "01", D1, GPE = "02", D2, GPE = "03", D3, GPE = "10", DA, GPE = "11", DB _ , GPE = "12", DC, GPE = "13", DD, GPE = "20", DE, GPE = "21", DF, GPE = "22", DG, GPE = "23", DH _ , GPE = "30", DI, GPE = "31", DJ, GPE = "32", DK, GPE = "33", DL) Case 2 UDF = UDF & "; " & Switch(GPE = "01", E1, GPE = "02", E2, GPE = "03", E3, GPE = "10", EA, GPE = "11", EB _ , GPE = "12", EC, GPE = "13", ED, GPE = "20", EE, GPE = "21", EF, GPE = "22", EG, GPE = "23", EH _ , GPE = "30", EI, GPE = "31", EJ, GPE = "32", EK, GPE = "33", EL) Case 3 UDF = UDF & "; " & Switch(GPE = "01", F1, GPE = "02", F2, GPE = "03", F3, GPE = "10", FA, GPE = "11", FB _ , GPE = "12", FC, GPE = "13", FD, GPE = "20", FE, GPE = "21", FF, GPE = "22", FG, GPE = "23", FH _ , GPE = "30", FI, GPE = "31", FJ, GPE = "32", FK, GPE = "33", FL) Case Else UDF = "Quá Ngu & Cút Ngay!": Exit Function End Select ChuoiTim = Mid(ChuoiTim, VTr + 1, Len(ChuoiTim)) End If Loop UDF = Mid$(UDF, 3, Len(UDF)) End Function
Chỉ cần test với dữ liệu thực thì biết thôi chứ cần gì phải hỏi.2-Phải chăng bạn đã lấy quy luật của các dữ liệu trên? (Dữ liệu là mình chỉ lấy ví dụ đơn giản cho dễ hiểu mà thôi, thực tế khi mã hóa thì sẽ không có quy luật nào cả.
(1) Thiết nghĩ bạn có thể đưa phần bạn đã rút gọn Code để mọi người & trong đó có mình được chiêm nghiệm được không & thay mặt cho những người đang quan tâm xin cảm ơn bạn trướcSau một hồi chọc ngoáy linh tinh, mình đã rút gọn được code của bạn xuống 1/2 mà kết quả vẫn đúng(1) (Còn về nguyên lý và lý thuyết hoạt động có bị sai hay không mình mù tịt). Bởi vì mình không hiểu rõ các câu lệnh.
Bạn giải thích giúp mình câu này với nhé. (2)
UDF = Mid$(UDF, 3, Len(UDF)) (số 3 là như nào hả bạn? Liệu cho lên thành số 4,,,5..... được không?
Nếu không tìm được quy luật dữ liệu chịu khó nhập array L1, L2, L3Cảm ơn bạn @HieuCD đã quan tâm giúp đỡ.
Cảm ơn bạn rất nhiều!
fnc của bạn súc tích quá, mình đã test và kết quả rất rất đúng:
Nhưng code của bạn viết khó hiểu quá.
1-Mình thấy bạn đưa vào rất ít dữ liệu aLoai = Array("", "a1,b1,c1", "d1,e1,f1", "g1,i1,k1")
Thế sao kết quả lại ra đúng được nhể?
2-Phải chăng bạn đã lấy quy luật của các dữ liệu trên? (Dữ liệu là mình chỉ lấy ví dụ đơn giản cho dễ hiểu mà thôi, thực tế khi mã hóa thì sẽ không có quy luật nào cả.)
Bạn có thể giải thích giúp mình các câu lệnh trong code để mình vận dụng nhé.
Trân thành cảm ơn bạn!
Bài đã được tự động gộp:
Một lần nữa cảm ơn bạn @SA_DQ nhé!
Sau một hồi chọc ngoáy linh tinh, mình đã rút gọn được code của bạn xuống 1/2 mà kết quả vẫn đúng (Còn về nguyên lý và lý thuyết hoạt động có bị sai hay không mình mù tịt). Bởi vì mình không hiểu rõ các câu lệnh.
Bạn giải thích giúp mình câu này với nhé.
Loop
UDF = Mid$(UDF, 3, Len(UDF)) (số 3 là như nào hả bạn? Liệu cho lên thành số 4,,,5..... được không?
End Function
Cảm ơn bạn nhé!
Function DEF(ByVal iStr$, Optional iLoai& = 1) As String
Dim aDK, aLoai, L1, L2, L3, S, Res(), j&
aDK = ",,,01,02,03,10,11,12,13,20,21,22,23,30,31,32,33,"
L1 = Array("a1,b1,c1", "a2,b2,c2", "a3,b3,c3", "a4,b4,c4", "a5,b5,c5", "a6,b6,c6", "a7,b7,c7", "a8,b8,c8", "a9,b9,c9", "a10,b10,c10", "a11,b11,c11", "a12,b12,c12", "a13,b13,c13", "a14,b14,c14", "a15,b15,c15")
L2 = Array("d1,e1,f1", "d2,e2,f2", "d3,e3,f3", "d4,e4,f4", "d5,e5,f5", "d6,e6,f6", "d7,e7,f7", "d8,e8,f8", "d9,e9,f9", "d10,e10,f10", "d11,e11,f11", "d12,e12,f12", "d13,e13,f13", "d14,e14,f14", "d15,e15,f15")
L3 = Array("g1,i1,k1", "g2,i2,k2", "g3,i3,k3", "g4,i4,k4", "g5,i5,k5", "g6,i6,k6", "g7,i7,k7", "g8,i8,k8", "g9,i9,k9", "g10,i10,k10", "g11,i11,k11", "g12,i12,k12", "g13,i13,k13", "g14,i14,k14", "g15,i15,k15")
aLoai = Array("", L1, L2, L3)
S = Split("," & iStr, ",")
For j = 1 To UBound(S)
c = Int(InStr(1, aDK, "," & S(j) & ",") / 3)
If c > 0 Then
k = k + 1
ReDim Preserve Res(1 To k)
Res(k) = aLoai(iLoai)(c - 1)
End If
Next j
DEF = Join(Res, "; ")
End Function
Trời ạ, mình đã bảo là không hiểu code nên không biết đúng sai (Chỉ thấy kết quả đúng thì mình ngộ nhận là đúng thôi)Chỉ cần test với dữ liệu thực thì biết thôi chứ cần gì phải hỏi.
Nếu có kinh nghiệm thì nhìn
Res(k) = Replace(aLoai(iLoai), "1", c)
cũng đủ hiểu.
Bạn @SA_DQ xem giúp mình rút gọn code như này có đúng lý thuyết không bạn nhé.(1) Thiết nghĩ bạn có thể đưa phần bạn đã rút gọn Code để mọi người & trong đó có mình được chiêm nghiệm được không & thay mặt cho những người đang quan tâm xin cảm ơn bạn trước
(2) Bạn có thể tự thử để hiểu mệnh đề đó mà, bằng nhiều cách chọc ngoái của bạn mà!
Bạn nói dữ liệu của bạn không theo qui luật. Vậy thì chạy code với dữ liệu không theo qui luật thì sẽ có kết quả sai chứ làm sao kết quả đúng được. Người ta nói là chạy với dữ liệu thực và NHÌN kết quả. Đâu cần phải hiểu code để biết kết quả sai hay đúng?Trời ạ, mình đã bảo là không hiểu code nên không biết đúng sai (Chỉ thấy kết quả đúng thì mình ngộ nhận là đúng thôi)
=ABC("01,02";1)
=UDF("01,02";1)
Bạn hầu như không có rút gọn bằng cách đó; vì những tham biến D1, D2, D3, DA,. . . . bạn chưa nhập trị cho chúng; Hay bạn định bắt chúng lấy trị trên trang tính hay thông qua các Name của trang??Bạn @SA_DQ xem giúp mình rút gọn code như này có đúng lý thuyết không bạn nhé.
Liệu có rút gọn được bước nào nữa không?
Sao mình Test thử các kết quả đều đúng nhể? (Mình đã nói là mình không biết nguyên lý hoạt động của câu lệnh mà)Bạn hầu như không có rút gọn bằng cách đó; vì những tham biến D1, D2, D3, DA,. . . . bạn chưa nhập trị cho chúng; Hay bạn định bắt chúng lấy trị trên trang tính??
hihi... cảm ơn bạn, à à thử bằng cách nàyBạn nói dữ liệu của bạn không theo qui luật. Vậy thì chạy code với dữ liệu không theo qui luật thì sẽ có kết quả sai chứ làm sao kết quả đúng được. Người ta nói là chạy với dữ liệu thực và NHÌN kết quả. Đâu cần phải hiểu code để biết kết quả sai hay đúng?
Bài #24 liệt kê tất cả các dữ liệu, và bài #27 liệt kê chỉ cho 1 mã 01.
Bây giờ sửa dữ liệu trong bài #7 thành:
Dòng cần thay thế 1
...
02=hehe,hichic,blala
Với dữ liệu "THỰC" như thế để chạy code bài #27 phải sửa thành
Const D2 As String = "hehe,hichic,blala":
Bài #27 không sửa gì vì chỉ dữ liệu cho 01 được liệt kê. Bây giờ nhập 2 công thức
Mã:=ABC("01,02";1) =UDF("01,02";1)
Có kết quả nào đúng không? Có kết quả nào sai không? Để biết đúng sai có cần hiểu code không?
Bạn @batman1 cho hướng giải quyết giúp mình nhé!Không cần hiểu code cũng biết kết quả đúng phải là a1,b1,c1; hehe,hichic,blala
Tôi chỉ muốn ý thức cho bạn là code bài #31 chỉ đúng khi các mã 01, 02, ... có ĐÚNG 2 KÝ TỰ. Nếu các mã không có ĐÚNG 2 KÝ TỰ thì kết quả có thể sẽ sai. Cách kiểm tra:
=DEF("010,10";1)
=UDF("010,10";1)
Bạn @batman1, dữ liệu của mình bắt đầu từ Min= 0-Max=9000 (Tức là có mã từ 0,1,2......00...0001 và giới hạn đến max=9000)của bài #24 và #31 thì chỉ kết quả bài #24 đúng.
Ý thức cho những người khác để nếu có trường hợp mã có <> 2 ký tự thì họ khỏi bị bất ngờ thôi. Còn tôi tin là bạn LUÔN LUÔN có mã 2 ký tự thôi.
Chuyện rút gọn bạn hỏi người khác cũng được mà.![]()
Thì bạn thử chạy code với dữ liệu thực - mã THỰC thì bạn thấy đúng hay sai thôi. Tự bạn kiểm tra rồi NHÌN kết quả xem có đúng không thôi. Nếu kết quả sai thì code chưa chuẩn. Không biết code vẫn biết nhìn thấy kết quả đúng hay sai mà.Bạn @batman1, dữ liệu của mình bắt đầu từ Min= 0-Max=9000 (Tức là có mã từ 0,1,2......00...0001 và giới hạn đến max=9000)
Chắc chủ bài đăng thích dẫn dắt vấn đề đến chỗ cãi lộn dây!. . . . ., dữ liệu của mình bắt đầu từ Min= 0-Max=9000 (Tức là có mã từ 0,1,2......00...0001 và giới hạn đến max=9000)
Bạn @SA_DQ lại nghĩ ý xấu rồi.Chắc chủ bài đăng thích dẫn dắt vấn đề đến chỗ cãi lộn dây!
![]()
![]()
2uá quen rồi!
Function UDF(ChuoiTim As String, Optional DongDo As Byte = 1) As String '
Dim VTr As Byte: Dim DDK As String
ChuoiTim = ChuoiTim & ","
Do
VTr = InStr(ChuoiTim, ",")
If VTr < 1 Then
Exit Function
Else
DDK = Left(ChuoiTim, VTr - 1)
If DDK = "01" Then
UDF = UDF & "_" & Choose(DongDo, "a1,b1,c1", "d1,e1,f1", "g1,i1,k1")
ElseIf DDK = "02" Then
UDF = UDF & "_" & Choose(DongDo, "a2,b2,c2", "d2,e2,f2", "g2,i2,k2")
ElseIf DDK = "03" Then
UDF = UDF & "_" & Choose(DongDo, "a3,b3,c3", "d3,e3,f3", "g3,i3,k3")
ElseIf DDK = "10" Then
UDF = UDF & "_" & Choose(DongDo, "a4,b4,c4", "d4,e4,f4", "g4,i4,k4")
ElseIf DDK = "11" Then
UDF = UDF & "_" & Choose(DongDo, "a5,b5,c5", "d5,e5,f5", "g5,i5,k5")
ElseIf DDK = "12" Then
UDF = UDF & "_" & Choose(DongDo, "a6,b6,c6", "d6,e6,f6", "g6,i6,k6")
ElseIf DDK = "13" Then
UDF = UDF & "_" & Choose(DongDo, "a7,b7,c7", "d7,e7,f7", "g7,i7,k7")
ElseIf DDK = "20" Then
UDF = UDF & "_" & Choose(DongDo, "a8,b8,c8", "d8,e8,f8", "g8,i8,k8")
ElseIf DDK = "21" Then
UDF = UDF & "_" & Choose(DongDo, "a9,b9,c9", "d9,e9,f9", "g9,i9,k9")
ElseIf DDK = "22" Then
UDF = UDF & "_" & Choose(DongDo, "a10,b10,c10", "d10,e10,f10", "g10,i10,k10")
ElseIf DDK = "23" Then
UDF = UDF & "_" & Choose(DongDo, "a11,b11,c11", "d11,e11,f11", "g11,i11,k11")
ElseIf DDK = "30" Then
UDF = UDF & "_" & Choose(DongDo, "a12,b12,c12", "d12,e12,f12", "g12,i12,k12")
ElseIf DDK = "31" Then
UDF = UDF & "_" & Choose(DongDo, "a13,b13,c13", "d13,e13,f13", "g13,i13,k13")
ElseIf DDK = "32" Then
UDF = UDF & "_" & Choose(DongDo, "a14,b14,c14", "d14,e14,f14", "g14,i14,k14")
ElseIf DDK = "33" Then
UDF = UDF & "_" & Choose(DongDo, "a15,b15,c15", "d15,e15,f15", "g15,i15,k15")
Else
End If
ChuoiTim = Mid$(ChuoiTim, VTr + 1, Len(ChuoiTim))
End If
Loop
UDF = Mid$(UDF, 3, Len(UDF))
End Function
Function UDF(ChuoiTim As String, Optional DongDo As Byte = 1) As String '
Dim VTr As Byte, sNum As Byte:
Dim Arr, DDK As String
Const Dx As String = "a1,b1,c1;a2,b2,c2;a3,b3,c3;a4,b4,c4;a5,b5,c5;a6,b6,c6;a7,b7,c7;a8,b8,c8;a9,b9,c9;a10,b10,c10;a11,b11,c11;"
Const D1 As String = Dx & "a12,b12,c12;a13,b13,c13;a14,b14,c14;a15,b15,c15;"
Const Dy As String = "d1,e1,f1;d2,e2,f2;d3,e3,f3;d4,e4,f4;d5,e5,f5;d6,e6,f6;d7,e7,f7;d8,e8,f8;d9,e9,f9;d10,e10,f10;d11,e11,f11;"
Const D2 As String = Dy & "d12,e12,f12;d13,e13,f13;d14,e14,f14;d15,e15,f15;"
Const Dz As String = "G1,H1,I1;G2,H2,I2;G3,H3,I3;G4,H4,I4;G5,H5,I5;G6,H6,I6;G7,H7,I7;G8,H8,I8;G9,H9,I9;G10,H10,I10;G11,H11,I11;"
Const d3 As String = Dz & "G12,H12,I12;G13,H13,I13;G14,H14,I14;G15,H15,I15;"
On Error GoTo LoiCT
D0 = Choose(DongDo, D1, D2, d3): ChuoiTim = ChuoiTim & ","
Arr = Split(D0, ";")
Do
VTr = InStr(ChuoiTim, ",")
If VTr < 1 Then
Exit Function
Else
7 DDK = Left(ChuoiTim, VTr - 1)
8 sNum = Switch(DDK = "01", 0, DDK = "02", 1, DDK = "03", 2, DDK = "10", 3, DDK = "11", 4, DDK = "12", 5, DDK = "13", 6 _
, DDK = "20", 7, DDK = "21", 8, DDK = "22", 9, DDK = "23", 10, DDK = "30", 11, DDK = "31", 12, DDK = "32", 13, DDK = "33", 14)
9 UDF = UDF & "_" & Arr(sNum)
ChuoiTim = Mid$(ChuoiTim, VTr + 1, Len(ChuoiTim))
End If
Loop
UDF = Mid$(UDF, 3, Len(UDF))
Err_: Exit Function
LoiCT:
If Err = 94 Then
MsgBox Erl: UDF = UDF & " Nhâp Sai!"
Resume Err_
Else
MsgBox Err, , Error: Resume Next
End If
End Function
Làm gì có nghị định nào phong tỏa đâu chàng Cò; đó là 'Chỉ thị' mà!Đây bạn, phải đọc tin tức coi còn phong toả theo nghị định 16 không đã
Thân