Học tiếng Nhật: tải bài từ web, sắp xếp, phát âm, dịch nghĩa (1 người xem)

Liên hệ QC

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

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,895
Được thích
1,219
Xin chào các bạn,
OT copy một vùng dữ liệu từ Website về để vào trong cột B từ cột B này OT muốn chuyển dữ liệu sang thành dòng (như hình ảnh đính kèm bên dưới:
1607568922961.png
Nhờ các bạn xem và giúp đỡ OT ạ.
 

File đính kèm

Sao mình không đưa link website ấy.

Xin chào , befaint cảm ơn Bạn đã quan tâm và giúp đỡ OT.
"mình" xin được gửi link ạ: :"'
 
Xin chào các bạn,
OT copy một vùng dữ liệu từ Website về để vào trong cột B từ cột B này OT muốn chuyển dữ liệu sang thành dòng (như hình ảnh đính kèm bên dưới:
Bạn thử code này, máy tôi không có phông chữ này nên kết quả ra toàn chữ gì gì
PHP:
Option Explicit

Public Sub Gpe()
Dim sArr(), dArr(), I As Long, K As Long, R As Long
    sArr = Range("B2", Range("B100000").End(xlUp).Offset(2)).Value
    R = UBound(sArr)
ReDim dArr(1 To R, 1 To 4)
    For I = 1 To R - 2
        K = K + 1
        dArr(K, 1) = sArr(I, 1)
        If sArr(I + 3, 1) = Empty Then
            dArr(K, 3) = sArr(I + 1, 1)
            dArr(K, 4) = sArr(I + 2, 1)
            I = I + 3
        Else
            dArr(K, 2) = sArr(I + 1, 1)
            dArr(K, 3) = sArr(I + 2, 1)
            dArr(K, 4) = sArr(I + 3, 1)
            I = I + 4
        End If
    Next I
    Range("D2").Resize(K, 4) = dArr
End Sub
 
Lần chỉnh sửa cuối:
Bạn thử code này, máy tôi không có phông chữ này nên kết quả ra toàn chữ gì gì
PHP:
Option Explicit

Public Sub Gpe()
Dim sArr(), dArr(), I As Long, K As Long, R As Long
    sArr = Range("B2", Range("B100000").End(xlUp).Offset(2)).Value
    R = UBound(sArr)
ReDim dArr(1 To R, 1 To 4)
    K = 1
    For I = 1 To R - 2
        dArr(K, 1) = sArr(I, 1)
        If sArr(I + 3, 1) = Empty Then
            dArr(K, 3) = sArr(I + 1, 1)
            dArr(K, 4) = sArr(I + 2, 1)
            I = I + 3
        Else
            dArr(K, 2) = sArr(I + 1, 1)
            dArr(K, 3) = sArr(I + 2, 1)
            dArr(K, 4) = sArr(I + 3, 1)
            I = I + 4
        End If
        K = K + 1
    Next I
    Range("D2").Resize(K, 4) = dArr
End Sub
Con chào Thầy ạ,
Cảm ơn Thầy đã luôn quan tâm và giúp đỡ con ạ.
Code đơn giản mà hiệu quả lắm Thầy ơi, con cảm ơn Thầy nhiều ạ.
------
À Thầy ơi, nếu mỗi từ ở các cột D,E,F,G con muốn x5 lần hoặc x10 lần (để chép đi chép lại cho thuộc từ) do vậy mà code của Thầy thêm thế nào cho hiệu quả ạ.
Còn để viết Sub riêng nữa con làm được Thầy ạ.
Con cảm ơn Thầy ạ, chúc Thầy nhiều sức khỏe ạ.
 

File đính kèm

Code hơi chuối cơ mà lỡ làm rồi cũng góp vui luôn :p
OT cảm ơn bạn nhiều ạ.
----
Code bằng Python, ôm cả giao diện nên hơi nặng. :)

Điền url rồi ấn Download, kết quả là file text mở ra, Ctrl A-C, Ctrl + V vào Excel là được.

Link download

View attachment 250953
Úi trời, nhìn hoành tráng quá à. Cảm ơn bạn nhiều befaint.
 
À Thầy ơi, nếu mỗi từ ở các cột D,E,F,G con muốn x5 lần hoặc x10 lần (để chép đi chép lại cho thuộc từ) do vậy mà code của Thầy thêm thế nào cho hiệu quả ạ
Hoặc mình sửa tạm code thầy Ba Tê
Mã:
Option Explicit
Public Sub Gpe()
Dim sArr(), dArr(), I As Long, K As Long, R As Long, J As Long
    sArr = Range("B2", Range("B100000").End(xlUp).Offset(2)).Value
    R = UBound(sArr)
    Const X As Long = 5
ReDim dArr(1 To Int(R * X / 4) + 1, 1 To 4)
    For I = 1 To R - 2
        If sArr(I + 3, 1) = Empty Then
            Do While J < X
                K = K + 1
                J = J + 1
                dArr(K, 1) = sArr(I, 1)
                dArr(K, 3) = sArr(I + 1, 1)
                dArr(K, 4) = sArr(I + 2, 1)
            Loop
            I = I + 3
        Else
            Do While J < X
                K = K + 1
                J = J + 1
                dArr(K, 1) = sArr(I, 1)
                dArr(K, 2) = sArr(I + 1, 1)
                dArr(K, 3) = sArr(I + 2, 1)
                dArr(K, 4) = sArr(I + 3, 1)
            Loop
            I = I + 4
        End If
        J = 0
    Next I
    Range("D2").Resize(Rows.Count - 1, 4).ClearContents
    Range("D2").Resize(K, 4) = dArr
End Sub
 
Nếu mỗi từ ở các cột D,E,F,G con muốn x5 lần hoặc x10 lần (để chép đi chép lại cho thuộc từ) do vậy mà code của Thầy thêm thế nào cho hiệu quả ạ.
Sửa code của @Ba Tê như sau, muốn lặp bao nhiêu lần thì sửa câu "s = 10"
PHP:
Sub GpeBate()
Dim sArr(), dArr(), I As Long, K As Long, R As Long
Dim m As Long, n As Long, s As Long
    sArr = Range("B2", Range("B100000").End(xlUp).Offset(2)).Value
    R = UBound(sArr)
    s = 10
ReDim dArr(1 To R * s / 4, 1 To 5)
For m = 1 To s
    n = 0
    For I = 1 To R - 2
        K = K + 1
        n = n + 1
        dArr(K, 1) = sArr(I, 1)
        If sArr(I + 3, 1) = Empty Then
            dArr(K, 3) = sArr(I + 1, 1)
            dArr(K, 4) = sArr(I + 2, 1)
            dArr(K, 5) = n
            I = I + 3
        Else
            dArr(K, 2) = sArr(I + 1, 1)
            dArr(K, 3) = sArr(I + 2, 1)
            dArr(K, 4) = sArr(I + 3, 1)
            dArr(K, 5) = n
            I = I + 4
        End If
    Next I
Next m
    Range("D2").Resize(100000, 5).Clear
    Range("D2").Resize(K, 5) = dArr
    Range("D1").Resize(K, 5).Sort Key1:=[H1], Order1:=xlAscending, Header:=xlYes
    Range("H1").Resize(K, 1).Clear
End Sub
 
Hoặc mình sửa tạm code thầy Ba Tê
Mã:
Option Explicit
Public Sub Gpe()
Dim sArr(), dArr(), I As Long, K As Long, R As Long, J As Long
    sArr = Range("B2", Range("B100000").End(xlUp).Offset(2)).Value
    R = UBound(sArr)
    Const X As Long = 5
ReDim dArr(1 To Int(R * X / 4) + 1, 1 To 4)
    For I = 1 To R - 2
        If sArr(I + 3, 1) = Empty Then
            Do While J < X
                K = K + 1
                J = J + 1
                dArr(K, 1) = sArr(I, 1)
                dArr(K, 3) = sArr(I + 1, 1)
                dArr(K, 4) = sArr(I + 2, 1)
            Loop
            I = I + 3
        Else
            Do While J < X
                K = K + 1
                J = J + 1
                dArr(K, 1) = sArr(I, 1)
                dArr(K, 2) = sArr(I + 1, 1)
                dArr(K, 3) = sArr(I + 2, 1)
                dArr(K, 4) = sArr(I + 3, 1)
            Loop
            I = I + 4
        End If
        J = 0
    Next I
    Range("D2").Resize(Rows.Count - 1, 4).ClearContents
    Range("D2").Resize(K, 4) = dArr
End Sub
OT xin cảm ơn bạn nhiều ạ.
Sửa code của @Ba Tê như sau, muốn lặp bao nhiêu lần thì sửa câu "s = 10"
PHP:
Sub GpeBate()
Dim sArr(), dArr(), I As Long, K As Long, R As Long
Dim m As Long, n As Long, s As Long
    sArr = Range("B2", Range("B100000").End(xlUp).Offset(2)).Value
    R = UBound(sArr)
    s = 10
ReDim dArr(1 To R * s / 4, 1 To 5)
For m = 1 To s
    n = 0
    For I = 1 To R - 2
        K = K + 1
        n = n + 1
        dArr(K, 1) = sArr(I, 1)
        If sArr(I + 3, 1) = Empty Then
            dArr(K, 3) = sArr(I + 1, 1)
            dArr(K, 4) = sArr(I + 2, 1)
            dArr(K, 5) = n
            I = I + 3
        Else
            dArr(K, 2) = sArr(I + 1, 1)
            dArr(K, 3) = sArr(I + 2, 1)
            dArr(K, 4) = sArr(I + 3, 1)
            dArr(K, 5) = n
            I = I + 4
        End If
    Next I
Next m
    Range("D2").Resize(100000, 5).Clear
    Range("D2").Resize(K, 5) = dArr
    Range("D1").Resize(K, 5).Sort Key1:=[H1], Order1:=xlAscending, Header:=xlYes
    Range("H1").Resize(K, 1).Clear
End Sub
Con cảm ơn chú Mỹ nhiều ạ.
 
Con cảm ơn chú Mỹ nhiều ạ.
Bài này code không khó nhưng tôi thích code của anh @Ba Tê vì suy luận đơn giản ít nhức đầu. Do đó nếu sửa code đó tôi cũng muốn làm đơn giản và không nhức đầu giống vậy. Chứ bài 12 cũng sửa nhưng cứ như tôi thì suy luận quay cuồng cũng không hiểu tại sao dùng Do mà không dùng For next.
 
Bài này code không khó nhưng tôi thích code của anh @Ba Tê vì suy luận đơn giản ít nhức đầu. Do đó nếu sửa code đó tôi cũng muốn làm đơn giản và không nhức đầu giống vậy. Chứ bài 12 cũng sửa nhưng cứ như tôi thì suy luận quay cuồng cũng không hiểu tại sao dùng Do mà không dùng For next.
Dạ vâng chú, đúng là code được hay không phần lớn là phải tư duy được ạ,code của Thầy BaTe đúng là rất tuyệt chú nhỉ.
Vì sau khi xem các code này con cũng thấy hiểu và có thể code lại được ạ, nghĩa là nó không khó như con đã nghĩ.
Con cảm ơn chú đã tham gia và góp ý ạ.
 
Code của anh @Ba Tê do đơn giản nên có 1 chỗ có thể lỗi và đã chữa cháy, cách mà tôi cũng thường dùng, bạn tìm hiểu xem là chỗ nào?
Trời con chạy thấy không bị lỗi gì thì thấy là ngon lành rồi chú, khi nào lỗi xảy ra thì con mới biết chỗ nào được rồi tìm hiểu để xử lý chú ạ.
Còn đang chạy bình thường mà để phát hiện ra các tính huống lỗi có thể xảy ra thì với kiến thức học trước quên sau của con thế này thì khó cho con rồi.
Mong chú Mỹ chỉ giáo thêm ạ.
Cảm ơn chú Mỹ nhiều ạ.
 
- con chạy thấy không bị lỗi gì
- khó cho con rồi.
- Lão chữa cháy rồi còn đâu mà lỗi :p
- Thử nghĩ xem tại sao bình thường sArr vừa bằng dữ liệu, trường hợp này lại thấy lão ấy offset(2) tức là lớn hơn dữ liệu 2 dòng?
 
- Lão chữa cháy rồi còn đâu mà lỗi :p
- Thử nghĩ xem tại sao bình thường sArr vừa bằng dữ liệu, trường hợp này lại thấy lão ấy offset(2) tức là lớn hơn dữ liệu 2 dòng?
Để ngày mai con ngồi copy toàn bộ dữ liệu từ vựng của 50 bài về rồi chạy thử một phát xem thế nào ạ.. hehe chỉ nghĩ thôi mà thấy háo hức quá chú ạ.
Híc nếu vậy chắc phải thêm một cột bài học nữa rồi phải không chú Mỹ, giống như cột thứ tự để phân biệt là bài nào nữa ạ, nếu không thì không biết học đến đoạn nào là hết bài đó.
 
Để ngày mai con ngồi copy toàn bộ dữ liệu từ vựng của 50 bài về rồi chạy thử một phát xem thế nào ạ.. hehe chỉ nghĩ thôi mà thấy háo hức quá chú ạ.
Híc nếu vậy chắc phải thêm một cột bài học nữa rồi phải không chú Mỹ, giống như cột thứ tự để phân biệt là bài nào nữa ạ, nếu không thì không biết học đến đoạn nào là hết bài đó.
Đâu phải bài tập lúc nửa đêm đâu mà mai với mốt, mới 11 giờ kém 5
 
Đâu phải bài tập lúc nửa đêm đâu mà mai với mốt, mới 11 giờ kém 5
Rồi con dậy làm luôn đây ạ chú chờ con ít phút (khoảng 11h15 con gửi bài lên) , con thiết kế lại cơ sở dữ liệu đee làm cái tool học tập ạ, khi nào chú có hứng thú chú xem và xử lý lại giúp con cho nó tiện ích hơn ạ.
 
Rồi con dậy làm luôn đây ạ chú chờ con ít phút (khoảng 11h15 con gửi bài lên) , con thiết kế lại cơ sở dữ liệu đee làm cái tool học tập ạ, khi nào chú có hứng thú chú xem và xử lý lại giúp con cho nó tiện ích hơn ạ.
Vụ đó mai cũng được. Câu hỏi là tại sao lão kia cho sArr nhiều hơn dữ liệu 2 dòng cần trả lời trước

Lại còn ngồi mần làm gì nữa chời?
Suỵt! Lão ct đang đố code VBA.
 
Lại còn ngồi mần làm gì nữa chời?
File ở bài #7, dán 50 cái link vào đó là xong hết luôn rồi.
Túm váy lại là bài #7 mình chưa làm gì à?

View attachment 250990
Làm luôn rồi mà befaint,
Dữ liệu đổ về file txt xong chỉ việc copy vào Excel là xong.
--------
Ủa dán được cả 50link luôn hả bạn ahihi, sao lợi hại vậy cơ á.
 
50 lần, mỗi lần 1 link. Vậy tay sẽ dẻo. :)
Zời ạ, nẫu cả ruột , cứ tưởng là dán kiểu gì xong một phát nó lấy luôn 50 bài đan hí hửng =))
Bài đã được tự động gộp:

Vụ đó mai cũng được. Câu hỏi là tại sao lão kia cho sArr nhiều hơn dữ liệu 2 dòng cần trả lời trước
Hic đúng là vụ này khó à, con nghĩ một lúc mà chưa ra.
Số dòng của mảng dArr ít hơn số dòng của sArr mà sao lại thế nhỉ?
Con chịu rồi, để con suy nghĩ tiếp rồi trả lời câu này sau ạ. Hic
 
Lần chỉnh sửa cuối:
Bài này code không khó nhưng tôi thích code của anh @Ba Tê vì suy luận đơn giản ít nhức đầu. Do đó nếu sửa code đó tôi cũng muốn làm đơn giản và không nhức đầu giống vậy. Chứ bài 12 cũng sửa nhưng cứ như tôi thì suy luận quay cuồng cũng không hiểu tại sao dùng Do mà không dùng For next.
Nếu For ... Next thì có thể "túm gọn" nó thế này:

PHP:
Option Explicit

Public Sub Gpe()
Const x As Long = 10    'So lan '
Dim sArr(), dArr(), I As Long, K As Long, N As Long, R As Long
    sArr = Range("B2", Range("B100000").End(xlUp).Offset(2)).Value
    R = UBound(sArr)
ReDim dArr(1 To Fix(R * x / 3), 1 To 4)
For I = 1 To R - 3   'Mới sửa lại'
    For N = 1 To x
        K = K + 1
        dArr(K, 1) = sArr(I, 1)
        If sArr(I + 3, 1) = Empty Then
            dArr(K, 3) = sArr(I + 1, 1)
            dArr(K, 4) = sArr(I + 2, 1)
        Else
            dArr(K, 2) = sArr(I + 1, 1)
            dArr(K, 3) = sArr(I + 2, 1)
            dArr(K, 4) = sArr(I + 3, 1)
        End If
    Next N
    I = I + IIf(sArr(I + 3, 1) = Empty, 3, 4)
Next I
    Range("D2").Resize(100000, 4).ClearContents
    Range("D2").Resize(K, 4) = dArr
End Sub
 
Lần chỉnh sửa cuối:
V2 không phải điền gì hết, ấn một phát 'ăn' luôn 50 bài. Vậy được chửa?

Download File >>

View attachment 250995
V2 không phải điền gì hết, ấn một phát 'ăn' luôn 50 bài. Vậy được chửa?

Download File >>

View attachment 250995
Uầy ,,, tool này nhầm, befaint lợi hại quá àh.
Không biết ngoài từ vựng ra có thể lấy các dữ liệu như ngữ pháp, Renshuu B,Kaiwa.... bao kèm cả âm thanh được không vậy befaint, ẩn trong mỗi phần bài tập có cả lời giải nữa bạn ?

Nếu For ... Next thì có thể "túm gọn" nó thế này:

PHP:
Option Explicit

Public Sub Gpe()
Const x As Long = 10    'So lan '
Dim sArr(), dArr(), I As Long, K As Long, N As Long, R As Long
    sArr = Range("B2", Range("B100000").End(xlUp).Offset(2)).Value
    R = UBound(sArr)
ReDim dArr(1 To Fix(R * x / 3), 1 To 4)
For I = 1 To R - 2
    For N = 1 To x
        K = K + 1
        dArr(K, 1) = sArr(I, 1)
        If sArr(I + 3, 1) = Empty Then
            dArr(K, 3) = sArr(I + 1, 1)
            dArr(K, 4) = sArr(I + 2, 1)
        Else
            dArr(K, 2) = sArr(I + 1, 1)
            dArr(K, 3) = sArr(I + 2, 1)
            dArr(K, 4) = sArr(I + 3, 1)
        End If
    Next N
    I = I + IIf(sArr(I + 3, 1) = Empty, 3, 4)
Next I
    Range("D2").Resize(100000, 4).ClearContents
    Range("D2").Resize(K, 4) = dArr
End Sub
Hic Thầy chưa nghỉ ạ, con cảm ơn Thầy nhiều ạ.
 
Rồi con dậy làm luôn đây ạ chú chờ con ít phút (khoảng 11h15 con gửi bài lên) , con thiết kế lại cơ sở dữ liệu đee làm cái tool học tập ạ, khi nào chú có hứng thú chú xem và xử lý lại giúp con cho nó tiện ích hơn ạ.
Con đã thiết kế xong mẫu form kiểu như thế này, thầy @Ba Tê và chú @ptm0412 xem giúp con với ạ:
1607619239562.png

Tool của bạn @befaint , ở quan IT họ cấm không cho sử dụng trừ máy tính của cấp quản lý (nên hôm nay OT đã phải nhờ máy để chạy thử) ạ.
Nếu dùng máy tính cá nhân tự trang bị thì thoải mái ạ.
Bài đã được tự động gộp:

Con đã thiết kế xong mẫu form kiểu như thế này, thầy @Ba Tê và chú @ptm0412 xem giúp con với ạ:
1607619239562.png

Tool của bạn @befaint , ở quan IT họ cấm không cho sử dụng trừ máy tính của cấp quản lý (nên hôm nay OT đã phải nhờ máy để chạy thử) ạ.
Nếu dùng máy tính cá nhân tự trang bị thì thoải mái ạ.
Ahihihi, thành công rồi , con ra kết quả rồi ạ.
OT xin cảm ơn Thầy tất cả mọi người nhiều ạ.
Mã:
Option Explicit

Public Sub Gpe()
'Const x As Long = 10    'So lan '
Dim x As Long, BaiHoc As Long

Dim sArr(), dArr(), I As Long, K As Long, N As Long, R As Long
    sArr = Range("A2", Range("B100000").End(xlUp).Offset(2)).Value
    R = UBound(sArr)
    x = Range("E2").Value
    BaiHoc = Range("D2").Value
ReDim dArr(1 To Fix(R * x / 3), 1 To 5)

For I = 1 To R - 3   'M?i s?a l?i'
    If sArr(I, 1) = BaiHoc Then
        For N = 1 To x
            K = K + 1
            dArr(K, 1) = sArr(I, 1)
            dArr(K, 2) = sArr(I, 2)
            If sArr(I + 3, 2) = Empty Then
                dArr(K, 4) = sArr(I + 1, 2)
                dArr(K, 5) = sArr(I + 2, 2)
            Else
                dArr(K, 3) = sArr(I + 1, 2)
                dArr(K, 4) = sArr(I + 2, 2)
                dArr(K, 5) = sArr(I + 3, 2)
            End If
        Next N
        I = I + IIf(sArr(I + 3, 2) = Empty, 3, 4)
    End If
Next I
    Range("D4").Resize(100000, 5).ClearContents
    Range("D4").Resize(K, 5) = dArr
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Ghê gớm.Cái gì cũng biết vậy trời javascript,VBE,Python.còn kể thiếu gì nữa không thần tượng? Đoán là HTML cũng biết ít ít vì python và javascript có phần về lập trình web
 
Thử code VBA nhé. 99,99% code sẽ chạy chậm hơn EXE.

Code sẽ tự tải tất cả các bài. Nếu có 50 thì tải 50, nếu có 100 thì tải 100. Chỉ cần nhấn nút "Tải bài" rồi ngồi đợi.

Trong Module1 có Const sheetName = "Sheet1". Tức kết quả tải về sẽ nhập vào sheet1. Nếu sheet nhập có tên khác thì sửa thành tên hiện hành.
 

File đính kèm

Ghê gớm.Cái gì cũng biết vậy trời javascript,VBE,Python.còn kể thiếu gì nữa không thần tượng? Đoán là HTML cũng biết ít ít vì python và javascript có phần về lập trình web
Cả RPA nữa, giờ mình bí UiPath ngoài lão cái bang này ra không biết hỏi ai nữa... o_O
 
Thử code VBA nhé. 99,99% code sẽ chạy chậm hơn EXE.

Code sẽ tự tải tất cả các bài. Nếu có 50 thì tải 50, nếu có 100 thì tải 100. Chỉ cần nhấn nút "Tải bài" rồi ngồi đợi.

Trong Module1 có Const sheetName = "Sheet1". Tức kết quả tải về sẽ nhập vào sheet1. Nếu sheet nhập có tên khác thì sửa thành tên hiện hành.
Con chào Bác Siwtom,
Cảm ơn Bác đã luôn quan tâm & giúp con ạ,
hic hơn cả những gì con mong đợi rồi Bác ơi.
-----
Con sẽ code lại cho trang in theo bài & số lần lặp của mỗi từ giống như cột D:H để học từ ạ.
Con cảm ơn Bác siwtom,
Chúc Bác nhiều khỏe ạ.
 
Nếu For ... Next thì có thể "túm gọn" nó thế này
Code của anh là bước hơi cao cao của suy luận rồi. Suy luận đầu tiên của người mới học là:
- Muốn có 10 kết quả thì chạy code cũ 10 lần
- Muốn chạy 10 lần thì tạo vòng lặp trùm ra ngoài code cũ
- Chạy xong sẽ thấy nó nối tiếp nhau theo kiểu 1-50, rồi 1-50, ... 10 lần
- Bổ sung 1 cái sort cho nối tiếp kiểu 1-1-1-1-1 rồi tới 2-2-2-2-2 cho đến hết
- Sort xong thấy thứ tự không giống ban đầu vì theo abc. Thêm 1 cột chuyên dùng để sort

Đó là nội dung của code tôi viết
Khiếp quá thấy chú Mỹ thả cái buồn mà con mới tỉnh ngộ.. có phải do tham số I+4 max lên mới phải tăng kích thước thêm 2 dòng không chú ?
Không phải. Giờ làm thế này:
- Xoá cái offset(2) đi, cho nó lỗi
- Chạy khi thông báo lỗi thì nhấn debug rồi xem:
- i đang là bao nhiêu
- i +2 (mới sửa là +3) = bao nhiêu
- So sánh với số dòng của SArr (không có offset)
- Quay lại thông báo lỗi xem nó chửi đúng việc đó không
- Giả sử người viết là chính mình, thì khắc phục ra sao. Cẩn thận hơn thì nghĩ xem cách mình khắc phục có gây hậu quả gì không
 
Code của anh là bước hơi cao cao của suy luận rồi. Suy luận đầu tiên của người mới học là:
- Muốn có 10 kết quả thì chạy code cũ 10 lần
- Muốn chạy 10 lần thì tạo vòng lặp trùm ra ngoài code cũ
- Chạy xong sẽ thấy nó nối tiếp nhau theo kiểu 1-50, rồi 1-50, ... 10 lần
- Bổ sung 1 cái sort cho nối tiếp kiểu 1-1-1-1-1 rồi tới 2-2-2-2-2 cho đến hết
- Sort xong thấy thứ tự không giống ban đầu vì theo abc. Thêm 1 cột chuyên dùng để sort

Đó là nội dung của code tôi viết

Không phải. Giờ làm thế này:
- Xoá cái offset(2) đi, cho nó lỗi
- Chạy khi thông báo lỗi thì nhấn debug rồi xem:
- i đang là bao nhiêu
- i +2 (mới sửa là +3) = bao nhiêu
- So sánh với số dòng của SArr (không có offset)
- Quay lại thông báo lỗi xem nó chửi đúng việc đó không
- Giả sử người viết là chính mình, thì khắc phục ra sao. Cẩn thận hơn thì nghĩ xem cách mình khắc phục có gây hậu quả gì không

Xin chào chú Mỹ,
Cảm ơn chú Mỹ đã chỉ dẫn,
Con đã hiểu vấn đề và đã tự mình làm được cái Sheet FormIn dựa theo cơ sở dữ liệu lấy từ Website về trong tập tin đính kèm của Bác Siwtom @batman1
Con up lên đây để mọi người góp ý để phát triển thêm ạ & nếu bạn nào có nhu cầu thì sử dụng ạ.
 

File đính kèm

Chưa xong đâu. Còn câu hỏi kế tiếp:
Tại sao code ban đầu của lão @Ba Tê Redim dArr(1 to R, 1 to 4), sau đó ở bài 35 sửa lại Redim dArr( 1 to R/ 3 *x, 1 to 4)?
Tại sao code của tôi lại Redim dArr( 1 to R/4 *s, 1 to 5)?
______
Biết đặt ra câu hỏi tại sao và biết trả lời, thế mới từ từ tiến bộ.
 
Chưa xong đâu. Còn câu hỏi kế tiếp:
Tại sao code ban đầu của lão @Ba Tê Redim dArr(1 to R, 1 to 4), sau đó ở bài 35 sửa lại Redim dArr( 1 to R/ 3 *x, 1 to 4)?
Tại sao code của tôi lại Redim dArr( 1 to R/4 *s, 1 to 5)?
______
Biết đặt ra câu hỏi tại sao và biết trả lời, thế mới từ từ tiến bộ.
Dạ theo con hiểu:
Redim dArr( 1 to R/4 *s, 1 to 5)
1 to 5 là vì thêm 1 cột thứ tự để sort theo cột này, còn R/4*s là vì mảng sArr có mỗi cột có 4 dòng nếu chuyển về 1 dòng 4 cột thì chỉ còn 1 dòng, tiếp tục * với số lần lặp lại ạ.
Như vậy phải không chú Mỹ?
 
mỗi cột có 4 dòng nếu chuyển về 1 dòng 4 cột thì chỉ còn 1 dòng
Như vậy phải không chú Mỹ?
Đúng. Nhưng tạm đúng. Suy luận như vậy thì thật ra dữ liệu 5 dòng chuyển thành 1 dòng 4 cột (dòng trống không cần chuyển). Tuy nhiên nếu chia 5 thì hơi thiếu, do dữ liệu có chỗ thiếu dòng còn 4. Chia 4 thì hơi dư nhưng dư ít thôi
Vậy ban đầu tại sao lão @Ba Tê không chia, sau đó lại chia 3? Không chia luôn có được không?
 
Lần chỉnh sửa cuối:
Đúng. Nhưng tạm đúng. Suy luận như vậy thì thật ra dữ liệu 5 dòng chuyển thành 1 dòng 4 cột (dòng trống không cần chuyển). Tuy nhiên nếu chia 5 thì hơi thiếu, do dữ liệu có chỗ thiếu dòng còn 4. Chia 4 thì hơi dư nhưng dư ít thôi
Vậy ban đầu tại sao lão @Ba Tê không chia, sau đó lại chia 3? Không chia luôn có được không?
Hihi, con cảm ơn chú.
Nếu không chia thì chắc là sẽ tốn kém tài nguyên thì phải.
Qua cách làm của thầy Ba Tê và của chú con đã hiểu chỉ cần đổi thứ tự vòng lặp là có thể xử lý được việc thêm cột phụ để sort hay không, chính vì làm từng bước của chú Mỹ mà con nhận thấy được vấn đề này.
Cảm ơn chú Mỹ đã chỉ dẫn ạ.
 
Con up lên đây để mọi người góp ý để phát triển thêm ạ & nếu bạn nào có nhu cầu thì sử dụng ạ.
Trang học tiếng Nhật sử dụng responsiveVoice để phát âm từ trang https://responsivevoice.org.

Nếu ai quan tâm thì nghiên cứu API trên trang https://responsivevoice.org.

Tôi làm qua, bạn thử xem.

1. Có thể chọn từng ô (dùng chuột hoặc bàn phím) trong cột B của sheet "TU VUNG" để nghe phát âm.

2. Nếu nhấn nút "Tải phát âm" thì code sẽ tải về và ghi trên đĩa ở thư mục có tập tin Excel, mỗi tập tin MP3 có tên chính là chỉ số dòng của từ trên trang tính "TU VUNG". Tức vd. tập tin 19.mp3 là phát âm cho từ ở B19 của sheet TU VUNG. Do code ghi hàng nghìn tập tin MP3 trong cùng thư mục với tập tin Excel nên cần tạo 1 thư mục riêng và lưu tập tin Excel vào đấy.

Cả 1 và 2 đều dùng phát âm của Google.

Cách 1 luôn phải dùng kết nối internet vì chỉ khi chọn từ - chọn ô thì code mới tải nhạc về máy và ghi tạm trên đĩa -> phát nhạc -> xóa tập tin nhạc đã ghi trên đĩa.

Cách 2 thì các tập tin MP3 đã có trên máy nên không cần có internet. Nếu dùng cách 2 thì sửa Sub Worksheet_SelectionChange của sheet "TU VUNG" để phát nhạc từ tập tin trên đĩa.
 

File đính kèm

Nếu không chia thì chắc là sẽ tốn kém tài nguyên thì phải.
Đúng là không chia thì tốn kém tài nguyên, nhưng ban đầu không có yêu cầu nhân x nên tốn kém ít. Sau đó có nhu cầu nhân với x (10 chẳng hạn), nếu dữ liệu 100.000 dòng sẽ là 1 triệu, tốn kém bị nhân lên 10 lần.
Bây giờ tới câu hỏi khác liên quan đến cái dự án "Form In" tuyệt vời kia:
Trong code có 2 câu lệnh:
PHP:
Set Fnd = .Range("A1:A" & Lr).Find(BaiHoc)
Set Rng = .Range(.Cells(Fnd.Row, Fnd.Column + 1), .Cells(Fnd.Row, Fnd.Column + 1))
- Câu lệnh số 2 cho kết quả là mấy ô?
- Rng kết quả câu 2 so với Fnd kết quả câu 1 khác nhau thế nào mà phải thêm 1 câu lệnh?
 
Trang học tiếng Nhật sử dụng responsiveVoice để phát âm từ trang https://responsivevoice.org.

Nếu ai quan tâm thì nghiên cứu API trên trang https://responsivevoice.org.

Tôi làm qua, bạn thử xem.

1. Có thể chọn từng ô (dùng chuột hoặc bàn phím) trong cột B của sheet "TU VUNG" để nghe phát âm.

2. Nếu nhấn nút "Tải phát âm" thì code sẽ tải về và ghi trên đĩa ở thư mục có tập tin Excel, mỗi tập tin MP3 có tên chính là chỉ số dòng của từ trên trang tính "TU VUNG". Tức vd. tập tin 19.mp3 là phát âm cho từ ở B19 của sheet TU VUNG. Do code ghi hàng nghìn tập tin MP3 trong cùng thư mục với tập tin Excel nên cần tạo 1 thư mục riêng và lưu tập tin Excel vào đấy.

Cả 1 và 2 đều dùng phát âm của Google.

Cách 1 luôn phải dùng kết nối internet vì chỉ khi chọn từ - chọn ô thì code mới tải nhạc về máy và ghi tạm trên đĩa -> phát nhạc -> xóa tập tin nhạc đã ghi trên đĩa.

Cách 2 thì các tập tin MP3 đã có trên máy nên không cần có internet. Nếu dùng cách 2 thì sửa Sub Worksheet_SelectionChange của sheet "TU VUNG" để phát nhạc từ tập tin trên đĩa.

Con chào Bác Siwtom,
Con cảm ơn Bác Siwtom rất nhiều.
Ahii, càng lúc càng cảm thấy tuyệt vời quá Bác ơi.
Có lẽ tên chủ đề này cũng lên sửa thành "công cụ hỗ trợ học tiếng Nhật" thay vì tên chủ đề "Chuyển dữ liệu từ cột sang dòng theo điều kiện" vì từ bài 39 của Bác (với code vba từ file Excel) đã lấy thẳng dữ liệu từ Website về theo nhu cầu với tên chủ đề rồi, để những người mà muốn học tiếng Nhật có thể biết đến thay vì là học code VBA ạ :D
Chú @ptm0412 nếu thấy hợp lý thì chú sửa lại tên chủ đề giúp con với ạ? Con cảm ơn chú Mỹ.
-----
Con đang nghĩ đến việc tạo thêm sheet "KIEM TRA" để kiểm tra ngẫu nhiên những từ đã học theo bài và theo các lựa chọn hiện con chưa có ý tưởng về thiết kế thế nào, để con nghĩ thêm sau đó con sẽ thông tin lại lên đây ạ,nếu không xử lý được con lại up lên đây nhờ mọi người tiếp sức ạ.

Đúng là không chia thì tốn kém tài nguyên, nhưng ban đầu không có yêu cầu nhân x nên tốn kém ít. Sau đó có nhu cầu nhân với x (10 chẳng hạn), nếu dữ liệu 100.000 dòng sẽ là 1 triệu, tốn kém bị nhân lên 10 lần.
Bây giờ tới câu hỏi khác liên quan đến cái dự án "Form In" tuyệt vời kia:
Trong code có 2 câu lệnh:
PHP:
Set Fnd = .Range("A1:A" & Lr).Find(BaiHoc)
Set Rng = .Range(.Cells(Fnd.Row, Fnd.Column + 1), .Cells(Fnd.Row, Fnd.Column + 1))
- Câu lệnh số 2 cho kết quả là mấy ô?
- Rng kết quả câu 2 so với Fnd kết quả câu 1 khác nhau thế nào mà phải thêm 1 câu lệnh?

Con chào chú Mỹ,cảm ơn chú Mỹ ạ
Hehe tuyệt vời thật ah chú Mỹ,
Con chẳng biết xử lý kiểu gì vì cột bài học ở sheet dữ liệu lấy từ Website trong sheet "TU VUNG" nó chỉ có một từ không liên tục giống như một khối dữ liệu từ vựng của mỗi bài nên con nghĩ đến việc sử dụng tìm kiếm rồi di chuyển sang 1 cột, sau đó quét mảng dữ liệu liên tục.... thành ra code nó phải tách làm 2 dòng như vậy ạ.
Trước khi con đổ dữ liệu vào mảng thì cũng đã sử câu lệnh select đến vị trí trước xem có đúng không ạ, chính vì thế mà trong code con vẫn để các dòng select để khi cần có thể kiểm tra lại.
Câu lệnh "Fnd " là để tìm vị trí của bài học sau khi xác định vị trí được rồi thì tai dòng Fnd.Row & Fnd.Column + 1 (dịch sang bên phải 1 cột) để di chuyển đến vùng dữ liệu liên tục.
Theo qui định của thuộc tính Range có 2 tham số lên nó thành: .Range(.Cells(Fnd.Row, Fnd.Column + 1), .Cells(Fnd.Row, Fnd.Column + 1))
Ủa tự nhiên được khen con thấy mình tiến bộ hay sau ấy hí hí hí..
 
(dịch sang bên phải 1 cột)
...
Theo qui định của thuộc tính Range có 2 tham số lên nó thành: .Range(.Cells(Fnd.Row, Fnd.Column + 1), .Cells(Fnd.Row, Fnd.Column + 1))
Ủa tự nhiên được khen con thấy mình tiến bộ hay sau ấy hí hí hí..
Dịch sang phải 1 cột thì có cái hàm offset rất tuyệt vời
Nếu dùng offset thì mắc gì phải dùng Range cho bị lệ thuộc vào việc 2 tham số
Kết hợp với câu 1 thì chẳng cần đến 2 câu:
PHP:
Set Rng = .Range("A1:A" & Lr).Find(BaiHoc).Offset(0, 1)
_______
Hình như mình mắng mà nó tưởng mình khen, thôi kệ, cho nó miếng động lực :P :P
 
Dịch sang phải 1 cột thì có cái hàm offset rất tuyệt vời
Nếu dùng offset thì mắc gì phải dùng Range cho bị lệ thuộc vào việc 2 tham số
Kết hợp với câu 1 thì chẳng cần đến 2 câu:
PHP:
Set Rng = .Range("A1:A" & Lr).Find(BaiHoc).Offset(0, 1)
_______
Hình như mình mắng mà nó tưởng mình khen, thôi kệ, cho nó miếng động lực :p :p
Vầng xong con sẽ sửa lại chỗ này, con măm măm đã ạ (khuya khuya rồi con lại tiếp tục) không bọn trẻ nó đói (vừa về đến nhà con nhận được cái file kèm âm thanh của bác Siwtom thích quá lại vào máy ngồi).
Chú sửa giúp con tên chủ đề với ạ, con cảm ơn chú Mỹ.
 
"mình" xin được gửi link ạ: :"'
Tôi làm vui, một cách dùng Power query connect web!
 

File đính kèm

Vậy sửa luôn 3 câu thành 1, gộp luôn cả Offset cả Resize. Chú khỏi hỏi thêm câu nữa, khỏi thức phia
PHP:
Set r = .Range("A1:A" & Lr).Find(BaiHoc).Offset(0, 1).Resize(, 4)
Con chào chú Mỹ, chắc chú chưa để ý chỗ: Rng.End(xlDown) để quét toàn bộ khối dữ liệu của bài học (đến dòng cuối của bài) vì mỗi bài được cách nhau bởi dấu cách tìm được.
Hôm nay con cũng phải loay hoay mãi chỗ này,chính vì thế để gộp cả 3 câu thành 1 thì câu lệnh trên lại phải dài thêm nữa rồi khó nhìn hơn chú ạ.
Nên con chọn cách gộp 2 dòng cho dễ nhìn chú ạ.
Con thấy tên chủ đề đã thay đổi con cảm ơn chú @ptm0412 rất nhiều, hi vọng ứng dụng này sẽ được phát triển thêm để có thêm tiện ích và cảm hứng cho người học ạ.

Phiền chú có thể sửa giúp con tại bài 1 bổ sung thêm 1 đoạn gì ghi chú khác biệt gì đó để thông tin đến mọi người hoặc đính kèm thêm tập tin tại bài 48 của bác Siwtom được không ạ?

Tôi làm vui, một cách dùng Power query connect web!
Xin chào excel_lv1.5,
Xin cảm ơn bạn đã quan tâm & chỉ dẫn cho OT biết thêm cách mới,
OT đã được thấy sự lợi hại của "Power query" qua nhiều bài viết của bạn và chú Mỹ, nên nhiều lúc cũng muốn tìm hiểu thêm mà thấy ngại quá ạ.
OT thấy bạn có kiến thức cao về code rất mong được bạn tham gia & góp ý thêm cho ứng dụng "Học tiếng Nhật" này ạ.
 
Hôm nay con cũng phải loay hoay mãi chỗ này,chính vì thế để gộp cả 3 câu thành 1 thì câu lệnh trên lại phải dài thêm nữa rồi khó nhìn hơn chú ạ.
Biết dừng đúng lúc. Câu này khen thật
------
Xin chào excel_lv1.5,
Xin cảm ơn bạn đã quan tâm & chỉ dẫn cho OT biết thêm cách mới,
OT đã được thấy sự lợi hại của "Power query" qua nhiều bài viết của bạn và chú Mỹ, nên nhiều lúc cũng muốn tìm hiểu thêm mà thấy ngại quá ạ.
Power query mức độ căn bản như tài liệu tôi viết là đủ xài, khi đụng vấn đề lớn như những bài của @excel_lv1.5 thì dừng cũng phải, chứ chưa gì đã ngại sao? Lỡ khen câu trên chả lẽ rút lại.
 
Xin chào tất cả mọi người ( @batman1 @ptm0412 @Ba Tê @excel_lv1.5 ...)
Con đã tạo thêm một mẫu sheet "ON TAP" với ý tưởng như ảnh kèm bên dưới,Bác/Thầy và Chú xem & giúp con xem thiết kế như này có ổn không ạ?
Hic con xin phép, giờ con phải học một chút tiếng Nhật ạ tối mai con đi học rồi mà cả ngày nay loay hoay mãi cái công cụ chưa được chữ nào vào đầu cả, ngày mai con vẫn phải đi làm chắc đêm mai con mới code thử được ạ. Nếu thầy/Chú/Bác có nhã hứng & thời gian code chơi & phát triển thêm giúp con được thì còn gì bằng ạ.
Cảm ơn tất cả mọi người ạ.

Untitled.jpg
 

File đính kèm

Trang học tiếng Nhật sử dụng responsiveVoice để phát âm từ trang https://responsivevoice.org.
Nếu ai quan tâm thì nghiên cứu API trên trang https://responsivevoice.org.

Tôi làm qua, bạn thử xem.

1. Có thể chọn từng ô (dùng chuột hoặc bàn phím) trong cột B của sheet "TU VUNG" để nghe phát âm.

2. Nếu nhấn nút "Tải phát âm" thì code sẽ tải về và ghi trên đĩa ở thư mục có tập tin Excel, mỗi tập tin MP3 có tên chính là chỉ số dòng của từ trên trang tính "TU VUNG". Tức vd. tập tin 19.mp3 là phát âm cho từ ở B19 của sheet TU VUNG. Do code ghi hàng nghìn tập tin MP3 trong cùng thư mục với tập tin Excel nên cần tạo 1 thư mục riêng và lưu tập tin Excel vào đấy.

Cả 1 và 2 đều dùng phát âm của Google.

Cách 1 luôn phải dùng kết nối internet vì chỉ khi chọn từ - chọn ô thì code mới tải nhạc về máy và ghi tạm trên đĩa -> phát nhạc -> xóa tập tin nhạc đã ghi trên đĩa.

Cách 2 thì các tập tin MP3 đã có trên máy nên không cần có internet. Nếu dùng cách 2 thì sửa Sub Worksheet_SelectionChange của sheet "TU VUNG" để phát nhạc từ tập tin trên đĩa.
Bác ơi, hiện tại bác đang sử dụng trình phát âm của Google vậy nếu phải để phát âm từ trang https://responsivevoice.org. , thì code có thay đổi nhiều không ạ?
Nếu ít Bác xem giúp con với ạ, bác có thểm thêm giúp con mục lựa chọn nguồn theo Google hoặc trang https://responsivevoice.org. tại ô nào đó trên bảng tính được không ạ?
Con cảm ơn Bác nhiều ạ.
 
Biết dừng đúng lúc. Câu này khen thật
------

Power query mức độ căn bản như tài liệu tôi viết là đủ xài, khi đụng vấn đề lớn như những bài của @excel_lv1.5 thì dừng cũng phải, chứ chưa gì đã ngại sao? Lỡ khen câu trên chả lẽ rút lại.
Dạ chú, ngại vì còn ít tuổi (cũng già đầu 3 :D rồi ấy) con muốn dành thời gian cho gia đình & công việc trước ạ.
Hiện nay vba con thấy giải quyết khá là hữu ích có thể tùy biến các kiểu còn "Power query" thì nó còn phụ thuộc vào cơ sở dữ liệu nguồn phải chuẩn chỉnh nữa thì phải ạ.
 
Bác ơi, hiện tại bác đang sử dụng trình phát âm của Google vậy nếu phải để phát âm từ trang https://responsivevoice.org. , thì code có thay đổi nhiều không ạ?
Nếu ít Bác xem giúp con với ạ, bác có thểm thêm giúp con mục lựa chọn nguồn theo Google hoặc trang https://responsivevoice.org. tại ô nào đó trên bảng tính được không
Khác nhiều. Mà tôi không muốn nghiên cứu API.

Bạn chờ xem có ai đã hoặc muốn tìm hiểu API của responsiveVoice.
 
Lần chỉnh sửa cuối:
Khác nhiều. Mà tôi không muốn nghiên cứu API.

Bạn chờ xem có ai đã hoặc muốn tìm hiểu API của responsiveVoice.
Con cảm ơn Bác đã thông tin ạ,
Bác ơi có thể lấy dữ liệu phần ngữ pháp của tất cả các bài về 1 sheet như mục từ vựng được không a?
Nếu được, Bác xem giúp con ạ.
 
@NHN_Phương

Một phương pháp mạnh mẽ khác để tham khảo

Code lấy dữ liệu từ vựng mà không cần phải chép tay

Chỉ cần gõ hàm:
=S_Scraper("https://tiengnhatvn.com/minna-no-nihongo/bai-[x]-tu-vung", 1, 50)


Ứng dụng hoạt động cần cài đặt trong ứng dụng Internet Explorer nếu chưa cài:
tls-ssl-protocols.png
 

File đính kèm

Lần chỉnh sửa cuối:
@NHN_Phương
Dưới đây là code để đọc chữ thành tiếng

Có hai hàm:
SpeakerXL Đọc không cần đợi
SpeakerXL_Busy Đọc và ở trang thái bận đọc
Speaker là giọng đọc, cần cài tiếng Nhật cho window để có thể đọc tiếng Nhật


JavaScript:
'                    _,
' ___   _   _  _ ___(_)
'/ __| / \ | \| | _ | |
'\__ \/ \ \| \\ | _ \ |
'|___/_/ \_|_|\_|___/_|
'
' Speaker
Option Explicit
#If VBA7 Then
  Private Declare PtrSafe Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
  Private Declare PtrSafe Function GetShortPathName Lib "KERNEL32" Alias "GetShortPathNameW" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
#Else
  Private Declare  Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
  Private Declare  Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
#End If

'                    _,
' ___   _   _  _ ___(_)
'/ __| / \ | \| | _ | |
'\__ \/ \ \| \\ | _ \ |
'|___/_/ \_|_|\_|___/_|
'
'==================================================================================================

Private Sub SpeakerXL_Busy_Test()
  Call SpeakerXL_Busy("My NickName is Sanbi", 0, 1.5)
 
End Sub

Sub SpeakerXL_Busy(Optional Text As String, _
              Optional Speaker As Integer = 0, _
              Optional Speed As Double = 1, _
              Optional Volume As Integer = 100, _
              Optional IsSpeakerVietnamese As Boolean = True)
  DoEvents
  Dim oVoice As SpeechLib.SpVoice
  Set oVoice = VBA.CreateObject("SAPI.SpVoice")
  If VBA.IsNumeric(Speaker) Then
    Set oVoice.Voice = oVoice.GetVoices.Item(Speaker)
  Else
    Set oVoice.Voice = oVoice.GetVoices("Name=" & Speaker).Item(0)
  End If
  If IsSpeakerVietnamese Then
    Dim i As Long
    For i = 0 To oVoice.GetVoices.Count - 1
      Set oVoice.Voice = oVoice.GetVoices.Item(i)
      If oVoice.Voice.GetDescription Like "* An*" Then
        Exit For
      End If
    Next
  End If
  oVoice.Rate = Speed
  oVoice.Volume = Volume
  oVoice.Speak Text
  Set oVoice = Nothing
End Sub
'                    _,
' ___   _   _  _ ___(_)
'/ __| / \ | \| | _ | |
'\__ \/ \ \| \\ | _ \ |
'|___/_/ \_|_|\_|___/_|
'
Private Sub SpeakerXL_test()
  Call SpeakerXL("My NickName is Sanbi", 0, 1.5, 100, 0)
  'Call SpeakerXL("NickName c" & VBA.ChrW$(7911) & "a t" & VBA.ChrW$(244) & "i l" & VBA.ChrW$(224) & " Sanbi")
End Sub
Sub SpeakerXL(Optional Text As String, _
              Optional Speaker = 0, _
              Optional Speed As Double = 1, _
              Optional Volume As Integer = 100, _
              Optional IsSpeakerVietnamese As Boolean = True)
  On Error Resume Next
  Call mciSendString("close all", "", 0, 0)
  Const SAFT48kHz16BitStereo = 39
  Const SSFMCreateForWrite = 3
  Dim oFileStream As SpeechLib.SpFileStream
  Dim oVoice As SpeechLib.SpVoice
  Dim xpath As String
  xpath = VBA.Environ$("temp") & "\Sample.wav"
  GoSub Save
  xpath = GetShortPath(xpath)
  Set oFileStream = VBA.CreateObject("SAPI.SpFileStream")
  oFileStream.Format.Type = SAFT48kHz16BitStereo
  oFileStream.Open xpath, SSFMCreateForWrite, True
  Set oVoice = VBA.CreateObject("SAPI.SpVoice")
  If VBA.IsNumeric(Speaker) Then
    Set oVoice.Voice = oVoice.GetVoices.Item(Speaker)
  Else
    Set oVoice.Voice = oVoice.GetVoices("Name=" & Speaker).Item(0)
  End If
 
'  If IsSpeakerVietnamese Then
'    Dim I As Long
'    For I = 0 To oVoice.GetVoices.Count - 1
'      Set oVoice.Voice = oVoice.GetVoices.Item(I)
'      Debug.Print oVoice.Voice.GetDescription
'      If oVoice.Voice.GetDescription Like "* An*" Then
'
'        Exit For
'      End If
'    Next
'  End If

  Set oVoice.AudioOutputStream = oFileStream
  oVoice.Volume = 100
  oVoice.Speak Text, SpeechLib.SpeechVoiceSpeakFlags.SVSFDefault
  oVoice.Rate = Speed
  oVoice.Volume = 100
  oFileStream.Close
  Set oFileStream = Nothing
  Set oVoice = Nothing
 
  Call mciSendString("open " & xpath & " alias fmusic", "", 0, 0)
  Call mciSendString("play fmusic", "", 0, 0)
Exit Sub
Save:
  With VBA.CreateObject("ADODB.Stream")
    .Type = 2 'Stream type
    .Charset = "utf-8" 'or utf-16 etc
    .Open
    .WriteText ""
    .SaveToFile xpath, 2 'Save binary data To disk
  End With
  VBA.err.Clear
Return
End Sub

'                    _,
' ___   _   _  _ ___(_)
'/ __| / \ | \| | _ | |
'\__ \/ \ \| \\ | _ \ |
'|___/_/ \_|_|\_|___/_|
'
Private Function GetShortPath(ByVal Path As String) As String
  Dim ret&, Buff As String * 512
  ret = GetShortPathName(VBA.StrConv(Path, 64), Buff, 512)
  GetShortPath = VBA.Left(StrConv(Buff, 128), ret)
End Function
 
Lần chỉnh sửa cuối:
@NHN_Phương

Một phương pháp mạnh mẽ khác để tham khảo

Code lấy dữ liệu từ vựng mà không cần phải chép tay

Chỉ cần gõ hàm:
=S_Scraper("https://tiengnhatvn.com/minna-no-nihongo/bai-[x]-tu-vung", 1, 50)


Ứng dụng hoạt động cần cài đặt trong ứng dụng Internet Explorer nếu chưa cài:
View attachment 251104
Cảm ơn HeSanbi rất nhiều,
Phiền bạn có thể làm thêm giúp OT các hàm lấy, mục Renshuu B , Kaiwa , Mondai , Bunkei , Renshuuc , Reibun , Renshuuc được không ạ?
 
Xin chào tất cả mọi người ( @batman1 @ptm0412 @Ba Tê @excel_lv1.5 ...)
Con đã tạo thêm một mẫu sheet "ON TAP" với ý tưởng như ảnh kèm bên dưới,Bác/Thầy và Chú xem & giúp con xem thiết kế như này có ổn không ạ?
Hic con xin phép, giờ con phải học một chút tiếng Nhật ạ tối mai con đi học rồi mà cả ngày nay loay hoay mãi cái công cụ chưa được chữ nào vào đầu cả, ngày mai con vẫn phải đi làm chắc đêm mai con mới code thử được ạ. Nếu thầy/Chú/Bác có nhã hứng & thời gian code chơi & phát triển thêm giúp con được thì còn gì bằng ạ.
Cảm ơn tất cả mọi người ạ.
Tôi không để ý là trên trang học tiếng Nhật các tên bài "Bài 1", ..., "Bài 50", các từ tiếng Nhật (có thể cả các từ tiếng Việt) lại có thừa dấu cách ở cuối. Vì vậy trong Sub saveData:
sửa
Mã:
result(count, 0) = lessonName
thành
Mã:
result(count, 0) = Trim(lessonName)

và sửa
Mã:
If c Then result(count, c) = text.innerText
thành.
Mã:
If c Then result(count, c) = Trim(text.innerText)

Trong tập tin đính kèm ở dưới tôi đã loại bỏ dấu cách thừa trong dữ liệu.
------------
1. Về nút ÔN TẬP tôi thấy không cần thiết.

2. Cột Q không cần thiết vì dựa vào J1 có thể biết các đáp án đúng nằm ở cột nào. Nếu J1 = "JP" thì đáp án đúng là cột C, ngược lại thì cột D.

3. Về vùng F4:J13 tôi đề nghị Conditional Formatting và chọn mầu vàng.
Mã:
=COUNTIF($B$2:$B$7320,F4)
Nếu chọn (select) ô chưa có mầu vàng thì code thêm Bài thích hợp vào cột B, và do CF nên ô chuyển sang mầu vàng. Nếu chọn ô đang vàng thì code sẽ xóa các bài thích hợp khỏi cột B, và do CF nên ô mất mầu vàng. Có thể chọn cùng lúc nhiều ô. Vd. lúc đầu chọn "Bài 5" -> code thêm các dòng thuộc "Bài 5" từ "TU VUNG" sang cột B sheet ON TAP, và do CF nên J4 được tô vàng. Nếu tiếp theo chọn J4:J5 thì dữ liệu thuộc "Bài 5" bị xóa khỏi cột B và dữ liệu thuộc "Bài 10" được thêm vào, và do CF thì J4 mất mầu vàng còn J5 được tô vàng.

4. Khi dữ liệu trong cột B thay đổi trong điểm 3 thì dữ liệu trong cột L cũng thay đổi theo.

5. Nếu H1 thay đổi thì J1 cũng thay đổi và ngược lại. Cụ thể khi H1 = VI thì J1 = JP và ngược lại. Làm thế để không có chuyện H1 = V và J1 = VI.

6. Công thức trong cột O, P đã bị thay bởi code.

7. Code trong module sheet ON TAP
 

File đính kèm

Tôi không để ý là trên trang học tiếng Nhật các tên bài "Bài 1", ..., "Bài 50", các từ tiếng Nhật (có thể cả các từ tiếng Việt) lại có thừa dấu cách ở cuối. Vì vậy trong Sub saveData:
sửa
Mã:
result(count, 0) = lessonName
thành
Mã:
result(count, 0) = Trim(lessonName)

và sửa
Mã:
If c Then result(count, c) = text.innerText
thành.
Mã:
If c Then result(count, c) = Trim(text.innerText)

Trong tập tin đính kèm ở dưới tôi đã loại bỏ dấu cách thừa trong dữ liệu.
------------
1. Về nút ÔN TẬP tôi thấy không cần thiết.

2. Cột Q không cần thiết vì dựa vào J1 có thể biết các đáp án đúng nằm ở cột nào. Nếu J1 = "JP" thì đáp án đúng là cột C, ngược lại thì cột D.

3. Về vùng F4:J13 tôi đề nghị Conditional Formatting và chọn mầu vàng.
Mã:
=COUNTIF($B$2:$B$7320,F4)
Nếu chọn (select) ô chưa có mầu vàng thì code thêm Bài thích hợp vào cột B, và do CF nên ô chuyển sang mầu vàng. Nếu chọn ô đang vàng thì code sẽ xóa các bài thích hợp khỏi cột B, và do CF nên ô mất mầu vàng. Có thể chọn cùng lúc nhiều ô. Vd. lúc đầu chọn "Bài 5" -> code thêm các dòng thuộc "Bài 5" từ "TU VUNG" sang cột B sheet ON TAP, và do CF nên J4 được tô vàng. Nếu tiếp theo chọn J4:J5 thì dữ liệu thuộc "Bài 5" bị xóa khỏi cột B và dữ liệu thuộc "Bài 10" được thêm vào, và do CF thì J4 mất mầu vàng còn J5 được tô vàng.

4. Khi dữ liệu trong cột B thay đổi trong điểm 3 thì dữ liệu trong cột L cũng thay đổi theo.

5. Nếu H1 thay đổi thì J1 cũng thay đổi và ngược lại. Cụ thể khi H1 = VI thì J1 = JP và ngược lại. Làm thế để không có chuyện H1 = V và J1 = VI.

6. Công thức trong cột O, P đã bị thay bởi code.

7. Code trong module sheet ON TAP
Con chào Bác Siwtom,
Con cảm ơn Bác nhiều ạ, hơn cả những gì con đang muốn,
Bác ơi vẫn là sheet "ON TAP" khi gộp bài có thể thêm câu lệnh sắp xếp ngẫu nhiên các từ vựng không ạ?
Hình như cần thêm cả phần xóa hết dữ liệu cũ khi muốn làm lại nữa Bác nhỉ.
 
Lần chỉnh sửa cuối:
Tôi không để ý là trên trang học tiếng Nhật các tên bài "Bài 1", ..., "Bài 50", các từ tiếng Nhật (có thể cả các từ tiếng Việt) lại có thừa dấu cách ở cuối. Vì vậy trong Sub saveData:
sửa
Mã:
result(count, 0) = lessonName
thành
Mã:
result(count, 0) = Trim(lessonName)

và sửa
Mã:
If c Then result(count, c) = text.innerText
thành.
Mã:
If c Then result(count, c) = Trim(text.innerText)

Trong tập tin đính kèm ở dưới tôi đã loại bỏ dấu cách thừa trong dữ liệu.
------------
1. Về nút ÔN TẬP tôi thấy không cần thiết.

2. Cột Q không cần thiết vì dựa vào J1 có thể biết các đáp án đúng nằm ở cột nào. Nếu J1 = "JP" thì đáp án đúng là cột C, ngược lại thì cột D.

3. Về vùng F4:J13 tôi đề nghị Conditional Formatting và chọn mầu vàng.
Mã:
=COUNTIF($B$2:$B$7320,F4)
Nếu chọn (select) ô chưa có mầu vàng thì code thêm Bài thích hợp vào cột B, và do CF nên ô chuyển sang mầu vàng. Nếu chọn ô đang vàng thì code sẽ xóa các bài thích hợp khỏi cột B, và do CF nên ô mất mầu vàng. Có thể chọn cùng lúc nhiều ô. Vd. lúc đầu chọn "Bài 5" -> code thêm các dòng thuộc "Bài 5" từ "TU VUNG" sang cột B sheet ON TAP, và do CF nên J4 được tô vàng. Nếu tiếp theo chọn J4:J5 thì dữ liệu thuộc "Bài 5" bị xóa khỏi cột B và dữ liệu thuộc "Bài 10" được thêm vào, và do CF thì J4 mất mầu vàng còn J5 được tô vàng.

4. Khi dữ liệu trong cột B thay đổi trong điểm 3 thì dữ liệu trong cột L cũng thay đổi theo.

5. Nếu H1 thay đổi thì J1 cũng thay đổi và ngược lại. Cụ thể khi H1 = VI thì J1 = JP và ngược lại. Làm thế để không có chuyện H1 = V và J1 = VI.

6. Công thức trong cột O, P đã bị thay bởi code.

7. Code trong module sheet ON TAP
Bác ơi, vẫn sheet "ON TAP" con thêm phần ôn tập từ cột T:W như hình,nhưng cái này con chưa thể code được, nếu Bác và mọi người có hứng thú thì xem & giúp con với ạ.
Con cảm ơn Bác ạ.

1607755956624.png
Bài đã được tự động gộp:

Vui tay viết nhiêu đó thôi. OT có thể nhờ các thành viên khác.
Cảm ơn HeSanbi, vậy OT chúc bạn luôn vui vẻ ạ.
 

File đính kèm

Hình như cần thêm cả phần xóa hết dữ liệu cũ khi muốn làm lại nữa Bác nhỉ.
Con đã phát hiện thấy chỗ này rồi chỉ cần tích lại những vùng đã được lựa chọn thì dữ liệu tại vùng đó sẽ mất màu vàng & dữ liệu cũng sẽ xóa... cứ như undo vậy xịn quá ahihi
Con cảm ơn Bác Siwtom.
 
Con đã phát hiện thấy chỗ này rồi chỉ cần tích lại những vùng đã được lựa chọn thì dữ liệu tại vùng đó sẽ mất màu vàng & dữ liệu cũng sẽ xóa... cứ như undo vậy xịn quá ahihi
Con cảm ơn Bác Siwtom.
Thì tôi viết rõ rồi mà, chỉ cần đọc thôi. Chọn ô chưa có mầu thì dữ liệu được thêm, và do CF thì ô được tô mầu. Khi chọn ô có mầu thì dữ liệu bị mất, và do CF thì mầu cũng mất.
 
Con chào Bác Siwtom,
Bác ơi vẫn là sheet "ON TAP" khi gộp bài có thể thêm câu lệnh sắp xếp ngẫu nhiên các từ vựng không ạ?
Ý bạn là vd. chọn Bài 12 và Bài 23 thì trong A: D và trong cột L đều có 85 dòng dữ liệu, nhưng 85 dòng của Bài 12 và Bài 23 được sắp xếp ngẫu nhiên trong cột L? Kiểu như: từ của Bài 12, từ của Bài 12, từ của Bài 23, từ của Bài 23, từ của Bài 23, từ của Bài 12, từ của Bài 23, từ của Bài 23, từ của Bài 12, ...?
 
Ý bạn là vd. chọn Bài 12 và Bài 23 thì trong A: D và trong cột L đều có 85 dòng dữ liệu, nhưng 85 dòng của Bài 12 và Bài 23 được sắp xếp ngẫu nhiên trong cột L? Kiểu như: từ của Bài 12, từ của Bài 12, từ của Bài 23, từ của Bài 23, từ của Bài 23, từ của Bài 12, từ của Bài 23, từ của Bài 23, từ của Bài 12, ...?
Dạ vâng đúng rồi Bác, vì hiện tại từ vựng lấy về cũng đang theo thứ tự như tính từ, động từ rồi ạ, nên khi nhớ được thứ tự gần nhau thì khi viết từ này sẽ hình dung được từ sau là gì ạ.
Con cảm ơn Bác nhiều ạ.
 
Con cảm ơn Bác đã thông tin ạ,
Bác ơi có thể lấy dữ liệu phần ngữ pháp của tất cả các bài về 1 sheet như mục từ vựng được không a?
Nếu được, Bác xem giúp con ạ.
Nhưng lấy những gì và trình bầy như thế nào? Tôi nghĩ là ngữ pháp nó như cuốn sách ấy. Tức vd. chọn Bài 23 thì ra 1 trang và ta lấy tất cả từ đầu tới cuối của phần giữa, tức bỏ menu ở trái và bỏ bảng 50 Bài ở phải. Toàn bộ nội dung mỗi bài ngữ pháp sẽ được ghi ở dạng sách, tức tập tin TXT hoặc DOCX ở ngoài đĩa trong cùng thư mục với tập tin Excel. Trong tập tin Excel chỉ cần Hyperlink, nếu cần thì nhấn để mở sách ngữ pháp.

Như trên?
 
Nhưng lấy những gì và trình bầy như thế nào? Tôi nghĩ là ngữ pháp nó như cuốn sách ấy. Tức vd. chọn Bài 23 thì ra 1 trang và ta lấy tất cả từ đầu tới cuối của phần giữa, tức bỏ menu ở trái và bỏ bảng 50 Bài ở phải. Toàn bộ nội dung mỗi bài ngữ pháp sẽ được ghi ở dạng sách, tức tập tin TXT hoặc DOCX ở ngoài đĩa trong cùng thư mục với tập tin Excel. Trong tập tin Excel chỉ cần Hyperlink, nếu cần thì nhấn để mở sách ngữ pháp.

Như trên?
Vâng Bác đúng như những gì Bác đã mô tả, kiểu quyét các vùng dữ liệu từ web sau đó copy và dán vào bảng tính ạ.
Vì phần ngữ pháp này con cũng thấy rất khó trình bày thế nào cho nó dễ nhìn ạ.
 
Vâng Bác đúng như những gì Bác đã mô tả, kiểu quyét các vùng dữ liệu từ web sau đó copy và dán vào bảng tính ạ.
Vì phần ngữ pháp này con cũng thấy rất khó trình bày thế nào cho nó dễ nhìn ạ.
Bạn đọc kỹ thì sẽ thấy tôi không nói là dán vào bảng tính.

Mà bạn giải thích chút vì tôi không hiểu. Phần từ vựng bạn muốn kéo về Excel thì hợp lý. Vì kéo về Eccel thì bạn có thể trình bầy theo cách của mình và ẩn đáp án, sắp xếp các từ theo thứ tự ngẫu nhiên.

Còn các phần khác như ngữ pháp và các phần tiếp theo nó như là những cuốn sách thì tại sao lại tải về ghi trên đĩa cho tốn công tốn đĩa? Muốn học ngữ pháp thì vào trang web rồi đọc thôi. Tôi không hiểu nhu cầu của bạn.
 
Lần chỉnh sửa cuối:
Nhưng lấy những gì và trình bầy như thế nào? Tôi nghĩ là ngữ pháp nó như cuốn sách ấy. Tức vd. chọn Bài 23 thì ra 1 trang và ta lấy tất cả từ đầu tới cuối của phần giữa, tức bỏ menu ở trái và bỏ bảng 50 Bài ở phải. Toàn bộ nội dung mỗi bài ngữ pháp sẽ được ghi ở dạng sách, tức tập tin TXT hoặc DOCX ở ngoài đĩa trong cùng thư mục với tập tin Excel. Trong tập tin Excel chỉ cần Hyperlink, nếu cần thì nhấn để mở sách ngữ pháp.

Như trên?
Bạn đọc kỹ thì sẽ thấy tôi không nói là dán vào bảng tính.
Vâng con tưởng dán đâu cũng được nên con nghĩ dán vào hết vào trong bảng tính cho tiện.
Nhưng ý Bác là dán riêng ra các file txt hoặc file docx để gọi từ link trong excel chắc là cũng thuận tiện ạ. Vì vấn đề này hiện con cũng đang chưa có ý tưởng gì Bác ạ.
Con cảm ơn Bác.
 
Vâng con tưởng dán đâu cũng được nên con nghĩ dán vào hết vào trong bảng tính cho tiện.
Nhưng ý Bác là dán riêng ra các file txt hoặc file docx để gọi từ link trong excel chắc là cũng thuận tiện ạ. Vì vấn đề này hiện con cũng đang chưa có ý tưởng gì Bác ạ.
Con cảm ơn Bác.
Thế còn câu hỏi của tôi?
Mà bạn giải thích chút vì tôi không hiểu. Phần từ vựng bạn muốn kéo về Excel thì hợp lý. Vì kéo về Eccel thì bạn có thể trình bầy theo cách của mình và ẩn đáp án, sắp xếp các từ theo thứ tự ngẫu nhiên.

Còn các phần khác như ngữ pháp và các phần tiếp theo nó như là những cuốn sách thì tại sao lại tải về ghi trên đĩa cho tốn công tốn đĩa? Muốn học ngữ pháp thì vào trang web rồi đọc thôi. Tôi không hiểu nhu cầu của bạn.
 
Thế còn câu hỏi của tôi?
Con chào Bác,
Câu hỏi phần sau hình như lúc con thông tin lại đến Bác chưa có,có thể Bác hỏi thêm vì con không thấy có thông báo mới về bài viết gửi về mail qua điện thoại nên con không biết.
Con muốn tải dữ liệu về chỉ mong muốn có thêm đầy đủ kiến đầy đủ cho ứng dụng này, nếu mỗi nhu cầu của con thì không quá cần thiết nhưng ở cơ quan con, có nhưng người cũng học cũng có máy tính nhưng máy tính của các bạn đó không được quyền truy cập internet nên con muốn tải thêm dữ liệu về ạ. Đúng là dữ liệu các phần sau như một cuốn sách nên khó có thể sắp xếp và làm cho nó đẹp theo ý như phần tự vựng được ạ.
Con cảm ơn Bác đã quan tâm và có ý giúp con ạ.
 
Con muốn tải dữ liệu về chỉ mong muốn có thêm đầy đủ kiến đầy đủ cho ứng dụng này, nếu mỗi nhu cầu của con thì không quá cần thiết nhưng ở cơ quan con, có nhưng người cũng học cũng có máy tính nhưng máy tính của các bạn đó không được quyền truy cập internet nên con muốn tải thêm dữ liệu về ạ.
Ở cơ quan thì phải làm việc chứ người ta cho "những ngưởi" kia làm việc khác? Còn về nhà thì chắc ai cũng có mạng rồi.

Mà thôi. Tôi giúp bạn 7 mục, còn 2 mục thì lên mạng học nhé.
-------------
Lưu ý:
1. sheet TU VUNG.
Chọn ô trong cột B thì code sẽ kiểm tra xem đã có tập tin âm thanh cho từ được chọn chưa. Nếu chưa có thì code sẽ tải về và ghi trong thư mục mp3. Sau đó code sẽ phát nhạc.

Sau khi đã tải dữ liệu và âm thanh cho TU VUNG thì có thể làm việc mà không cần kết nối mạng.

2. sheet "Ngu phap" và RenshuuC.
Nếu nhấn nút "Tải dữ liệu ..." thì code sẽ lấy nội dung trang web của từng bài rồi ghi ở dạng tập tin HTML trong thư mục html. Đồng thời code tạo link tới từng tập tin HTML. Vd. bài 10 của ngữ pháp sẽ được lưu với tên Ngu phap_Bài 10.html.

Sau khi tải hết các tập tin HTML thì có thể xem chúng mà không cần kết nối mạng.

3. sheet Kaiwa, Bunkei, Reibun và "Tham khảo".
Nếu nhấn nút "Tải dữ liệu ..." thì code sẽ lấy nội dung trang web của từng bài rồi ghi trên sheet tương ứng. Bài 1 ở cột A, bài 2 ở cột B v...v
Trên các trang web có loa để phát âm thanh. Những từ được phát âm ở trên web thì trên sheet được tô mầu vàng. Nếu chọn ô mầu vàng thì code sẽ kiểm tra xem đã có tập tin âm thanh cho từ được chọn chưa. Nếu chưa có thì code sẽ tải về và ghi trong thư mục mp3. Sau đó code sẽ phát nhạc.
Nếu nhấn nút "Tải âm thanh ..." thì những tập tin âm thanh cho tất cả những ô mầu vàng trên sheet sẽ được tải về.
Chỉ nhấn nút "Tải âm thanh ..." sau khi đã nhấn "Tải dữ liệu ..." vì code của "Tải âm thanh ..." phải kiểm tra xem từ nào được bôi vàng, tức cần phát âm.

Sau khi đã tải dữ liệu và âm thanh cho 4 sheet thì có thể làm việc mà không cần kết nối mạng.

4. sheet "ON TAP".
Khi chọn bài (F4:J13) thì dữ liệu được lấy từ "TU VUNG" sang cột A: D theo thứ tự, nhưng dữ liệu cho cột L (HOI) và Q (đáp án) sẽ được sắp xếp ngẫu nhiên. Nếu sau một hồi làm việc vẫn dữ liệu trong A: D không thay đổi (không chọn ô trong F4:J13) nhưng thay đổi H1, J1 thì dữ liệu cột L và Q sẽ hoán đổi cho nhau.

5. Tôi có tỉa tót chút code cũ nên tốt nhất bạn xem lại. Code của tôi có trong các module "mod...", module "ON TAP", và module ThisWorkbook.

6. Trong thư mục có chứa tập tin Excel bạn phải tự tạo 2 thư múc có tên là mp3 và html

7. Dữ liệu được lấy từ trang học tiếng Nhật, còn âm thanh lấy từ google. Rất có thể một ngày đẹp trời 2 trang web thay đổi giao diện và code không lấy được dữ liệu nữa. Vì thế khuyến cáo nhấn các nút "Tải dữ liệu ..." và "Tải âm thanh ..." trên từng sheet. Một khi đã có mọi dữ liệu rồi thì không sợ tèo, và cũng không cần kết nối mạng nữa.

8. Còn Renshuu B và Mondai bạn tự lên trang web học. Tôi chỉ giúp bạn 7 mục thôi.
 

File đính kèm

Ở cơ quan thì phải làm việc chứ người ta cho "những ngưởi" kia làm việc khác? Còn về nhà thì chắc ai cũng có mạng rồi.

Mà thôi. Tôi giúp bạn 7 mục, còn 2 mục thì lên mạng học nhé.
-------------
Lưu ý:
1. sheet TU VUNG.
Chọn ô trong cột B thì code sẽ kiểm tra xem đã có tập tin âm thanh cho từ được chọn chưa. Nếu chưa có thì code sẽ tải về và ghi trong thư mục mp3. Sau đó code sẽ phát nhạc.

Sau khi đã tải dữ liệu và âm thanh cho TU VUNG thì có thể làm việc mà không cần kết nối mạng.

2. sheet "Ngu phap" và RenshuuC.
Nếu nhấn nút "Tải dữ liệu ..." thì code sẽ lấy nội dung trang web của từng bài rồi ghi ở dạng tập tin HTML trong thư mục html. Đồng thời code tạo link tới từng tập tin HTML. Vd. bài 10 của ngữ pháp sẽ được lưu với tên Ngu phap_Bài 10.html.

Sau khi tải hết các tập tin HTML thì có thể xem chúng mà không cần kết nối mạng.

3. sheet Kaiwa, Bunkei, Reibun và "Tham khảo".
Nếu nhấn nút "Tải dữ liệu ..." thì code sẽ lấy nội dung trang web của từng bài rồi ghi trên sheet tương ứng. Bài 1 ở cột A, bài 2 ở cột B v...v
Trên các trang web có loa để phát âm thanh. Những từ được phát âm ở trên web thì trên sheet được tô mầu vàng. Nếu chọn ô mầu vàng thì code sẽ kiểm tra xem đã có tập tin âm thanh cho từ được chọn chưa. Nếu chưa có thì code sẽ tải về và ghi trong thư mục mp3. Sau đó code sẽ phát nhạc.
Nếu nhấn nút "Tải âm thanh ..." thì những tập tin âm thanh cho tất cả những ô mầu vàng trên sheet sẽ được tải về.
Chỉ nhấn nút "Tải âm thanh ..." sau khi đã nhấn "Tải dữ liệu ..." vì code của "Tải âm thanh ..." phải kiểm tra xem từ nào được bôi vàng, tức cần phát âm.

Sau khi đã tải dữ liệu và âm thanh cho 4 sheet thì có thể làm việc mà không cần kết nối mạng.

4. sheet "ON TAP".
Khi chọn bài (F4:J13) thì dữ liệu được lấy từ "TU VUNG" sang cột A: D theo thứ tự, nhưng dữ liệu cho cột L (HOI) và Q (đáp án) sẽ được sắp xếp ngẫu nhiên. Nếu sau một hồi làm việc vẫn dữ liệu trong A: D không thay đổi (không chọn ô trong F4:J13) nhưng thay đổi H1, J1 thì dữ liệu cột L và Q sẽ hoán đổi cho nhau.

5. Tôi có tỉa tót chút code cũ nên tốt nhất bạn xem lại. Code của tôi có trong các module "mod...", module "ON TAP", và module ThisWorkbook.

6. Trong thư mục có chứa tập tin Excel bạn phải tự tạo 2 thư múc có tên là mp3 và html

7. Dữ liệu được lấy từ trang học tiếng Nhật, còn âm thanh lấy từ google. Rất có thể một ngày đẹp trời 2 trang web thay đổi giao diện và code không lấy được dữ liệu nữa. Vì thế khuyến cáo nhấn các nút "Tải dữ liệu ..." và "Tải âm thanh ..." trên từng sheet. Một khi đã có mọi dữ liệu rồi thì không sợ tèo, và cũng không cần kết nối mạng nữa.

8. Còn Renshuu B và Mondai bạn tự lên trang web học. Tôi chỉ giúp bạn 7 mục thôi.
Con chào Bác Siwtom,
Con cảm ơn Bác nhiều ạ, nhờ có Bác mà mọi thứ cũng đã đầy đủ và hoàn thiện hơn ạ.
Con cảm ơn Bác nhiều ạ, nhờ có Bác mà mọi thứ cũng đã đầy đủ và hoàn thiện hơn ạ.
Con đã thử các trang dữ liệu tải dữ liệu về thì có trang "Ngu phap" & "RenshuuC" bị lỗi.

Sub saveGrammarRenshuuCData lỗi tại dòng:
Set ts = fso.CreateTextFile(filename, , True) với tên lỗi:"Path not found"

Ngoài ra còn một chức năng ôn tập (sắp xếp từ trong chuỗi lộn xộn) trong cột T:W con nêu ở bài 70:

Khi nào Bác có thời gian và hứng thú xem giúp con với ạ
Con chúc Bác nhiều sức khỏe, đầu tháng xin kính chúc mọi người vui khỏe & thành công.
OT
 
@NHN_Phương

Trang học tiếng Nhật miễn phí mà thực hiện gửi Request Http quá nhiều sẽ làm sập trang người ta.

Nếu có nhiều người đang cùng nhau học online ở trang này. Mà trang bị sập thì "tội ai".

OT xem xét, lợi cho cá nhân hay cho tập thể mà sử dụng sự trợ giúp.

Không những mất công sức người trợ giúp mà mất công bằng cho người học online. Và mất luôn công sức tập thể tạo trang miễn phí đó.

Tôi đã kiểm tra quá trình phản hồi của nguồn học tiếng Nhật, có khi phản hồi rất lâu, 30 giây đến một phút cho một Request.

Tôi thấy có sự mất công bằng ở đây nên tôi góp ý.
 
@NHN_Phương

Trang học tiếng Nhật miễn phí mà thực hiện gửi Request Http quá nhiều sẽ làm sập trang người ta.

Nếu có nhiều người đang cùng nhau học online ở trang này. Mà trang bị sập thì "tội ai".

OT xem xét, lợi cho cá nhân hay cho tập thể mà sử dụng sự trợ giúp.

Không những mất công sức người trợ giúp mà mất công bằng cho người học online. Và mất luôn công sức tập thể tạo trang miễn phí đó.

Tôi đã kiểm tra quá trình phản hồi của nguồn học tiếng Nhật, có khi phản hồi rất lâu, 30 giây đến một phút cho một Request.

Tôi thấy có sự mất công bằng ở đây nên tôi góp ý.
Xin chào HeSanbi,
Cảm ơn bạn đã góp ý,OT nghĩ mức độ không tới mức nghiêm trọng như vậy, vì OT chỉ cập nhật dữ liệu một lần thôi ạ chứ không phải lần nào sử dụng là cập nhật lân đó ạ.
 
Ối zời. Thế thì phải 'xử' ngay và luôn cái thằng ở bài #2/ #7 vì nó 'khơi mào' cái việc 'tội lỗi' lấy dữ liệu từ web về kia.
Thôi xong, đầu tháng đã phải kiêng 'thịt chó' và lên chùa 'xám hối' rồi. Tội lỗi, tội lỗi quá.
 
Sub saveGrammarRenshuuCData lỗi tại dòng:
Set ts = fso.CreateTextFile(filename, , True) với tên lỗi:"Path not found"
Có một điểm tôi quên. Giả sử tập tin Excel ở trong thư mục XYZ. Toàn bộ đường dẫn tới tập tin Excel không được phép có dấu vd. tiếng Việt. Nguyên nhân là code dùng Open ..., Dir. Đây không phải là yêu cầu quá cao. Tên thư mục, tên tập tin, tên sheet lkhông có dấu cũng chả chết ai.

Còn một điểm tôi nhắc lại. Trong XYZ bạn phải tạo 2 thư mục có tên là MP3 và HTML. Lý ra trong code tôi phải tự tạo nhưng quên mất.

Còn chuyện không tải được Ngữ pháp hay gì đó thì hơi vô lý. Lúc nửa đêm tôi đã thử nhấn cả 2 nút trên 4 sheet (Kaiwa, Bunkei, Reibun và "Tham khảo), và 1 nút trên 2 sheet (Ngu phap và RenshuuC), nút "Tải âm thanh" trên sheet "TU VUNG". Tôi cũng thử thao tác trên "ON TAP". Tôi không gặp bất cứ trở ngại gì. Request cũng không lâu. Tôi không gửi dữ liệu cho bạn vì nhiều quá ~37 MB. Nhưng tôi sẽ thử nén và gửi qua mediafire cho bạn.

Vài phút trước tôi xóa các tập tin ngữ pháp và thử tải lại. Tôi không gặp bất cứ trở ngại nào. Trên máy tôi quá trình request và ghi lại 50 HTML mất ~75 s. Tức mỗi một html cả request và ghi mất 1,5 s. Có lẽ không phải là rất lâu nhỉ.
 
Tôi gửi bạn link tải dữ liệu mà tôi đã đặt trên mediafire. Để mọi người khỏi chế giễu.

 
Tôi gửi bạn link tải dữ liệu mà tôi đã đặt trên mediafire. Để mọi người khỏi chế giễu.

Con chào Bác Siwtom,
Con đã tải file về và đã mở được từng bài học theo link, cảm ơn Bác Siwtom nhiều ạ.
Bác ơi có thể giúp con lấy phần Renshuu B được không ạ vì đây là phần luyện tập về ngữ pháp có thể nó nó quan trọng hơn các phần phía sau ạ.
Con cảm ơn Bác nhiều ạ.
 
Con chào Bác Siwtom,
Con đã tải file về và đã mở được từng bài học theo link, cảm ơn Bác Siwtom nhiều ạ.
Bác ơi có thể giúp con lấy phần Renshuu B được không ạ vì đây là phần luyện tập về ngữ pháp có thể nó nó quan trọng hơn các phần phía sau ạ.
Con cảm ơn Bác nhiều ạ.
Bạn nên kiểm tra lại xem đường dẫn tới tập tin Excel có chứa dấu tiếng Việt không. Tức có thư mục trong đường dẫn đó có tên có dấu không. Tiếp theo kiểm tra xem bạn đã tạo thư mục mp3 và html chưa. Tức trong cùng thư mục XYZ phải có: tập tin Excel, thư mục MP3 và HTML. Sau đó hãy thử tải lại ngữ pháp - copy toàn bộ cái tôi gửi sang chỗ khác để lưu -> xóa các tập tin HTML của tôi trước khi thử tải lại.

Tôi không thích tình huống khi mà tôi không có khó khăn gì nhưng ai đó phán một câu xanh rờn: Không chạy, có lỗi. Rồi để vấn đề lơ lửng như thế mà không lý giải rõ ràng.
 
Bạn nên kiểm tra lại xem đường dẫn tới tập tin Excel có chứa dấu tiếng Việt không. Tức có thư mục trong đường dẫn đó có tên có dấu không. Tiếp theo kiểm tra xem bạn đã tạo thư mục mp3 và html chưa. Tức trong cùng thư mục XYZ phải có: tập tin Excel, thư mục MP3 và HTML. Sau đó hãy thử tải lại ngữ pháp - copy toàn bộ cái tôi gửi sang chỗ khác để lưu -> xóa các tập tin HTML của tôi trước khi thử tải lại.

Tôi không thích tình huống khi mà tôi không có khó khăn gì nhưng ai đó phán một câu xanh rờn: Không chạy, có lỗi. Rồi để vấn đề lơ lửng như thế mà không lý giải rõ ràng.
Con chào Bác Siwtom,
Trong thư mục "Tieng Nhat" tại bài 88 con đã đổi tên thành "Tiếng Nhật" sau đó đổi tên thư mục 'html' & 'mp3' chứa dữ liệu cũ thành các tên khác , sau đó con đã tạo lại tên 2 thư mục này không có dữ liệu & thao tác lại các chức năng trong sheet "Ngu phap" & "RenshuuC" thì OK (không còn bị lỗi gì nữa) rồi ạ.
Cảm ơn Bác nhiều ạ.
 
Con chào Bác Siwtom,
Trong thư mục "Tieng Nhat" tại bài 88 con đã đổi tên thành "Tiếng Nhật" sau đó đổi tên thư mục 'html' & 'mp3' chứa dữ liệu cũ thành các tên khác , sau đó con đã tạo lại tên 2 thư mục này không có dữ liệu & thao tác lại các chức năng trong sheet "Ngu phap" & "RenshuuC" thì OK (không còn bị lỗi gì nữa) rồi ạ.
Cảm ơn Bác nhiều ạ.
Phải giải thích rõ ràng như thế. Để "lơ lửng" rồi người ta chế giễu tôi, phán này nọ như giáo viên phê bình học trò nhỏ. Như thế không được. Phán một câu xanh rời: Lỗi, rồi để đó là không được.
 
Phải giải thích rõ ràng như thế. Để "lơ lửng" rồi người ta chế giễu tôi, phán này nọ như giáo viên phê bình học trò nhỏ. Như thế không được. Phán một câu xanh rời: Lỗi, rồi để đó là không được.
Dạ vâng con cảm ơn Bác đã thông tin, con xin rút kinh nghiệm ạ.
 
Đúng. Nhưng tạm đúng. Suy luận như vậy thì thật ra dữ liệu 5 dòng chuyển thành 1 dòng 4 cột (dòng trống không cần chuyển). Tuy nhiên nếu chia 5 thì hơi thiếu, do dữ liệu có chỗ thiếu dòng còn 4. Chia 4 thì hơi dư nhưng dư ít thôi
Vậy ban đầu tại sao lão @Ba Tê không chia, sau đó lại chia 3? Không chia luôn có được không?
Con chào chú @ptm0412
Chỉ là con muốn tìm hiểu thêm kiến thức về mảng cụ thể là liên quan đến vấn đề khai báo kích thước mảng ạ, đối với trường hợp này thì có thể sử dụng Redim Preserve để tránh khai báo thừa (hoặc không phải tính toán trước kích thước mảng trước) được không ạ?
Nếu có thể chú chỉ dẫn thêm cho con cách ứng dụng trong trường hợp này với ạ.
Con cảm ơn chú Mỹ.
 
Chỉ là con muốn tìm hiểu thêm kiến thức về mảng cụ thể là liên quan đến vấn đề khai báo kích thước mảng ạ, đối với trường hợp này thì có thể sử dụng Redim Preserve để tránh khai báo thừa (hoặc không phải tính toán trước kích thước mảng trước) được không ạ?
Nếu có thể chú chỉ dẫn thêm cho con cách ứng dụng trong trường hợp này với ạ.
Đối với trường hợp này, và những trường hợp có thể ước tính số dòng/ cột thì nên ước tính. Bất đắc dĩ thì cho dư 1 chút không sao, còn hơn là Redim Preserve.
Lý do là hạn chế Redim Preserve
- Redim Preserve chỉ có thể khai báo tăng kích thước chiều cuối cùng: Mảng 1 chiều thì chiều 1, mảng 2 chiều thì chiều 2 (số cột), mảng n chiều thì chiều n. Nếu Redim (không preserve) chiều khác thì mất dữ liệu đang có
- Redim preserve muốn thay đổi số dòng của mảng 2 chiều sẽ phải xoay ngang mảng để dòng biến thành cột. Tư duy trừu tượng không tốt thì lẫn lộn nháo nhào i/ j, m/ n. Đã có lần tôi xoay ngang mảng như vậy và khi suy luận i hay j để viết m hay n thì cái đầu tôi nghiêng nghiêng, cái tay quơ quơ chỉ chỏ, miệng thì lẩm bẩm i lúc nãy là m, bây giờ i phải là n ... Kết quả thì đúng mà chung quanh tưởng tôi lên cơn khùng.
 
Lần chỉnh sửa cuối:
Bác ơi có thể giúp con lấy phần Renshuu B được không ạ vì đây là phần luyện tập về ngữ pháp có thể nó nó quan trọng hơn các phần phía sau ạ
Thôi tôi làm nốt Mondai và RenshuuB. Được hay không thì tôi cũng muốn dừng.

Tôi luôn mất nhiều thời gian để hướng dẫn nhưng có những lúc bạn không làm đúng như hướng dẫn làm mất thời gian của tôi. Lần này nếu bạn không làm đúng thì tôi kệ.
Lưu ý:
1. Đường dẫn tới tập tin Excel không được phép có dấu tiếng Việt và các thứ tiếng khác.

2. Trong thư mục chứa tập tin Excel phải có 3 thư mục với đúng tên là: mp3, html và media.

3. Trong thư mục html phải có 3 tập tin mà tôi sẽ đính kèm.

4. Trong html có 342 tập tin Mondai (tên có tiền tố Mondai_), 50 ngữ pháp (tên có tiền tố "Ngu phap_"), 50 RenshuuC (tiền tố RenshuuC_) và 350 RenshuuB (tiền tố RenshuuB_).

5. Trong mp3 có 2294 tập tin mp3 của từ vựng (đánh số thứ tự), 152 của Bunkei (tiền tố Bunkei_), 645 của Kaiwa (tiền tố Kaiwa_), 733 của Reibun (tiền tố Reibun_) và 1310 của Tham khảo (tiền tố "Tham khao_).

6. Trong media có 172 tập tin JPG + mp3 của Mondai (tiền tố Mondai_), 105 tập tin JPG của RenshuuB (tiền tố RenshuuB_)

7. Tải RenshuuB và Mondai mất nhiều thời gian vì nhiều tập tin HTML, JPG và MP3. Nhất là Mondai có những tập tin mp3 dài có dung lượng > 2 MB.

8. Thêm 1 sheet và đổi tên thành RenshuuB -> đặt 1 button trên sheet và gán cho nó macro Sub GetRenshuuBMondaiLesson

̣9. Thêm 1 sheet và đổi tên thành Mondai -> đặt 1 button trên sheet và gán cho nó macro Sub GetRenshuuBMondaiLesson

10. Thay toàn bộ code trong module modFunctions bằng nội dung tập tin modFunctions.txt. Thay toàn bộ code trong module modNguphapRenshuuC bằng nội dung tập tin modNguphapRenshuuC.txt. Tập tin modFunctions.txt và modNguphapRenshuuC.txt có trong tập tin RAR.

11. Trong RAR có 3 tập tin: bootstrap.css, bootstrap.js và jquery.js. Cả 3 tập tin phải đặt vào thư mực HTML (đã nói ở điểm 3).

Về các tập tin Mondai và RenshuuB thì bạn thử tải về để cho quen thao tác. Nếu có vấn đề thì tôi sẽ tải lên mediafire vì tôi đã tải hết rồi.

Về vấn đề nói trong bài #70 thì tôi đã nói với bạn nhiêu lần rồi. Giải thích phải để tôi hiểu chứ không phải để bạn mất ít nhất thời gian. "Đưa ..."? Đưa cái gì, bao nhiêu, từ đâu? Đưa khi có hiệu lệnh nào? Làm một cái đồng hồ để kiểm tra thời tiết, khi nào bắt đầu mưa thì "đưa ..."? Làm XYZ? Làm khi nào? Vào lúc "chào buổi sáng" khi đồng hồ báo thức? Hay khi kẻng ăn cơm, lúc anh csgt tuýt còi, hay khi cô hàng xóm anh hàng xóm tạo dáng? Làm XYZ khi sự kiện nào sảy ra? Đừng chỉ nói "Làm XYZ".
 

File đính kèm

Thôi tôi làm nốt Mondai và RenshuuB. Được hay không thì tôi cũng muốn dừng.

Tôi luôn mất nhiều thời gian để hướng dẫn nhưng có những lúc bạn không làm đúng như hướng dẫn làm mất thời gian của tôi. Lần này nếu bạn không làm đúng thì tôi kệ.
Lưu ý:
1. Đường dẫn tới tập tin Excel không được phép có dấu tiếng Việt và các thứ tiếng khác.

2. Trong thư mục chứa tập tin Excel phải có 3 thư mục với đúng tên là: mp3, html và media.

3. Trong thư mục html phải có 3 tập tin mà tôi sẽ đính kèm.

4. Trong html có 342 tập tin Mondai (tên có tiền tố Mondai_), 50 ngữ pháp (tên có tiền tố "Ngu phap_"), 50 RenshuuC (tiền tố RenshuuC_) và 350 RenshuuB (tiền tố RenshuuB_).

5. Trong mp3 có 2294 tập tin mp3 của từ vựng (đánh số thứ tự), 152 của Bunkei (tiền tố Bunkei_), 645 của Kaiwa (tiền tố Kaiwa_), 733 của Reibun (tiền tố Reibun_) và 1310 của Tham khảo (tiền tố "Tham khao_).

6. Trong media có 172 tập tin JPG + mp3 của Mondai (tiền tố Mondai_), 105 tập tin JPG của RenshuuB (tiền tố RenshuuB_)

7. Tải RenshuuB và Mondai mất nhiều thời gian vì nhiều tập tin HTML, JPG và MP3. Nhất là Mondai có những tập tin mp3 dài có dung lượng > 2 MB.

8. Thêm 1 sheet và đổi tên thành RenshuuB -> đặt 1 button trên sheet và gán cho nó macro Sub GetRenshuuBMondaiLesson

̣9. Thêm 1 sheet và đổi tên thành Mondai -> đặt 1 button trên sheet và gán cho nó macro Sub GetRenshuuBMondaiLesson

10. Thay toàn bộ code trong module modFunctions bằng nội dung tập tin modFunctions.txt. Thay toàn bộ code trong module modNguphapRenshuuC bằng nội dung tập tin modNguphapRenshuuC.txt. Tập tin modFunctions.txt và modNguphapRenshuuC.txt có trong tập tin RAR.

11. Trong RAR có 3 tập tin: bootstrap.css, bootstrap.js và jquery.js. Cả 3 tập tin phải đặt vào thư mực HTML (đã nói ở điểm 3).

Về các tập tin Mondai và RenshuuB thì bạn thử tải về để cho quen thao tác. Nếu có vấn đề thì tôi sẽ tải lên mediafire vì tôi đã tải hết rồi.

Về vấn đề nói trong bài #70 thì tôi đã nói với bạn nhiêu lần rồi. Giải thích phải để tôi hiểu chứ không phải để bạn mất ít nhất thời gian. "Đưa ..."? Đưa cái gì, bao nhiêu, từ đâu? Đưa khi có hiệu lệnh nào? Làm một cái đồng hồ để kiểm tra thời tiết, khi nào bắt đầu mưa thì "đưa ..."? Làm XYZ? Làm khi nào? Vào lúc "chào buổi sáng" khi đồng hồ báo thức? Hay khi kẻng ăn cơm, lúc anh csgt tuýt còi, hay khi cô hàng xóm anh hàng xóm tạo dáng? Làm XYZ khi sự kiện nào sảy ra? Đừng chỉ nói "Làm XYZ".
Con chào Bác Siwtom,
Con cảm ơn Bác nhiều vì đã dành thời gian giúp con ạ.
Hôm nay con không ngồi máy tính được, ngày mai con sẽ thông tin lại đến Bác ạ.
Con chúc Bác nhiều sức khỏe.
 
Thôi tôi làm nốt Mondai và RenshuuB. Được hay không thì tôi cũng muốn dừng.

Tôi luôn mất nhiều thời gian để hướng dẫn nhưng có những lúc bạn không làm đúng như hướng dẫn làm mất thời gian của tôi. Lần này nếu bạn không làm đúng thì tôi kệ.
Lưu ý:
1. Đường dẫn tới tập tin Excel không được phép có dấu tiếng Việt và các thứ tiếng khác.

2. Trong thư mục chứa tập tin Excel phải có 3 thư mục với đúng tên là: mp3, html và media.

3. Trong thư mục html phải có 3 tập tin mà tôi sẽ đính kèm.

4. Trong html có 342 tập tin Mondai (tên có tiền tố Mondai_), 50 ngữ pháp (tên có tiền tố "Ngu phap_"), 50 RenshuuC (tiền tố RenshuuC_) và 350 RenshuuB (tiền tố RenshuuB_).

5. Trong mp3 có 2294 tập tin mp3 của từ vựng (đánh số thứ tự), 152 của Bunkei (tiền tố Bunkei_), 645 của Kaiwa (tiền tố Kaiwa_), 733 của Reibun (tiền tố Reibun_) và 1310 của Tham khảo (tiền tố "Tham khao_).

6. Trong media có 172 tập tin JPG + mp3 của Mondai (tiền tố Mondai_), 105 tập tin JPG của RenshuuB (tiền tố RenshuuB_)

7. Tải RenshuuB và Mondai mất nhiều thời gian vì nhiều tập tin HTML, JPG và MP3. Nhất là Mondai có những tập tin mp3 dài có dung lượng > 2 MB.

8. Thêm 1 sheet và đổi tên thành RenshuuB -> đặt 1 button trên sheet và gán cho nó macro Sub GetRenshuuBMondaiLesson

̣9. Thêm 1 sheet và đổi tên thành Mondai -> đặt 1 button trên sheet và gán cho nó macro Sub GetRenshuuBMondaiLesson

10. Thay toàn bộ code trong module modFunctions bằng nội dung tập tin modFunctions.txt. Thay toàn bộ code trong module modNguphapRenshuuC bằng nội dung tập tin modNguphapRenshuuC.txt. Tập tin modFunctions.txt và modNguphapRenshuuC.txt có trong tập tin RAR.

11. Trong RAR có 3 tập tin: bootstrap.css, bootstrap.js và jquery.js. Cả 3 tập tin phải đặt vào thư mực HTML (đã nói ở điểm 3).

Về các tập tin Mondai và RenshuuB thì bạn thử tải về để cho quen thao tác. Nếu có vấn đề thì tôi sẽ tải lên mediafire vì tôi đã tải hết rồi.

Về vấn đề nói trong bài #70 thì tôi đã nói với bạn nhiêu lần rồi. Giải thích phải để tôi hiểu chứ không phải để bạn mất ít nhất thời gian. "Đưa ..."? Đưa cái gì, bao nhiêu, từ đâu? Đưa khi có hiệu lệnh nào? Làm một cái đồng hồ để kiểm tra thời tiết, khi nào bắt đầu mưa thì "đưa ..."? Làm XYZ? Làm khi nào? Vào lúc "chào buổi sáng" khi đồng hồ báo thức? Hay khi kẻng ăn cơm, lúc anh csgt tuýt còi, hay khi cô hàng xóm anh hàng xóm tạo dáng? Làm XYZ khi sự kiện nào sảy ra? Đừng chỉ nói "Làm XYZ".
Con chào Bác Siwtom,
Con đã làm theo hướng dẫn trên của Bác, kết quả là đúng với mong muốn của con rồi ạ, con không gặp phải lỗi gì Bác ạ.
Ngoài ra con mô tả lại vấn đề con nêu trong #70 trong file đính kèm nếu Bác còn hứng thú & thời gian Bác xem giúp con ạ (con thấy khi luyện với phương pháp này cũng sẽ rất hiệu quả ạ)
Còn đối với con mọi thứ cũng khá tương đối đầy đủ rồi ạ.
Con cảm ơn Bác nhiều ạ.

1608083901291.png
 

File đính kèm

Ngoài ra con mô tả lại vấn đề con nêu trong #70 trong file đính kèm nếu Bác còn hứng thú & thời gian Bác xem giúp con ạ (con thấy khi luyện với phương pháp này cũng sẽ rất hiệu quả ạ)
Để đơn giản chút thì tôi nghĩ có thể dùng cột X làm cột ĐÁP ÁN - giống như cột G có thể ẩn đi. Như thế có chấp nhận được không? Lúc đó phần T:X sẽ tương tự như phần L:Q. Cột L và U sẽ được sắp xếp ngẫu nhiên nhưng cột L <> cột U - 2 ngẫu nhiên khác nhau, tức 2 hoán vị khác nhau.
 
Để đơn giản chút thì tôi nghĩ có thể dùng cột X làm cột ĐÁP ÁN - giống như cột G có thể ẩn đi. Như thế có chấp nhận được không? Lúc đó phần T:X sẽ tương tự như phần L:Q. Cột L và U sẽ được sắp xếp ngẫu nhiên nhưng cột L <> cột U - 2 ngẫu nhiên khác nhau, tức 2 hoán vị khác nhau.
Con cảm ơn Bác Siwtom.
Dạ được quá chứ Bác ạ,như vậy đỡ khỏi sử dụng code tìm kiếm đáp án nữa ạ.
Vâng khi nào Bác có thời gian Bác xem giúp con ạ.
 

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

Back
Top Bottom