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
Sao mình không đưa link website ấy.
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ì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:
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
Con chào Thầy ạ,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
Code hơi chuối cơ mà lỡ làm rồi cũng góp vui luônXin 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:
View attachment 250949
Nhờ các bạn xem và giúp đỡ OT ạ.
OT cảm ơn bạn nhiều ạ.Code hơi chuối cơ mà lỡ làm rồi cũng góp vui luôn![]()
Úi trời, nhìn hoành tráng quá à. Cảm ơn bạn nhiều befaint.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
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
Hoặc mình sửa tạm code thầy Ba TêÀ 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ả ạ
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
Chắc không phải windows 10 rồi.INTERNAL ERROR: cannot create temporary directory!
không thể tạo thư mực tạm
Em win10 chạy ổn, nhìn xịn sò phết, muốn học viết cái như này thì làm sao đây bác nhỉChắc không phải windows 10 rồi.![]()
Mình học Python thôi.Em win10 chạy ổn, nhìn xịn sò phết, muốn học viết cái như này thì làm sao đây bác nhỉ![]()
Kỳ vậy nhỉ, win mình win 10 64, mà máy ngày rồi không mở, nay mới mở lên dowload về là nó báo lỗi đóChắc không phải windows 10 rồi.![]()
Thế do Windows 10 đó thiết lập gì gì đó rồi.Kỳ vậy nhỉ, win mình win 10 64, mà máy ngày rồi không mở, nay mới mở lên dowload về là nó báo lỗi đó
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"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ả ạ.
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
OT xin cảm ơn bạn nhiều ạ.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
Con cảm ơn chú Mỹ 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
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.Con cảm ơn chú Mỹ nhiều ạ.
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ỉ.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.
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?code của Thầy BaTe đúng là rất tuyệt chú nhỉ.
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ú ạ.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?
- Lão chữa cháy rồi còn đâu mà lỗi- con chạy thấy không bị lỗi gì
- khó cho con rồ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ú ạ.- Lão chữa cháy rồi còn đâu mà lỗi
- 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?
Đâ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Để 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 đó.
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 ạ.Đâ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
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ướcRồ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 ạ.
Suỵt! Lão ct đang đố code VBA.Lại còn ngồi mần làm gì nữa chời?
Làm luôn rồi mà befaint,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
50 lần, mỗi lần 1 link. Vậy tay sẽ dẻo.Ủa dán được cả 50link luôn hả bạn ahihi, sao lợi hại vậy cơ á.
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 =))50 lần, mỗi lần 1 link. Vậy tay sẽ dẻo.![]()
Hic đúng là vụ này khó à, con nghĩ một lúc mà chưa ra.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
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?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 =))
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ú ?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
Nếu For ... Next thì có thể "túm gọn" nó thế này: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.
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
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.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
Hic Thầy chưa nghỉ ạ, con cảm ơn Thầy nhiều ạ.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
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 ạ: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 ạ.
Ahihihi, thành công rồi , con ra kết quả rồi ạ.
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
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 webCái bang 1 túi nhá.![]()
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...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
Con chào Bác Siwtom,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.
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à:Nếu For ... Next thì có thể "túm gọn" nó thế này
Không phải. Giờ làm thế này: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ú ?
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
Chưa xong đâu. Còn câu hỏi kế tiếp:Con đã hiểu vấn đề
Dạ theo con hiểu: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ộ.
Đú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ôimỗ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ỹ?
Hihi, con cảm ơn chú.Đú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?
Trang học tiếng Nhật sử dụng responsiveVoice để phát âm từ trang https://responsivevoice.org.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 ạ.
Đú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.Nếu không chia thì chắc là sẽ tốn kém tài nguyên thì phải.
Set Fnd = .Range("A1:A" & Lr).Find(BaiHoc)
Set Rng = .Range(.Cells(Fnd.Row, Fnd.Column + 1), .Cells(Fnd.Row, Fnd.Column + 1))
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.
Đú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:
- Câu lệnh số 2 cho kết quả là mấy ô?PHP:Set Fnd = .Range("A1:A" & Lr).Find(BaiHoc) Set Rng = .Range(.Cells(Fnd.Row, Fnd.Column + 1), .Cells(Fnd.Row, Fnd.Column + 1))
- 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?
Dịch sang phải 1 cột thì có cái hàm offset rất tuyệt vời(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í..
Set Rng = .Range("A1:A" & Lr).Find(BaiHoc).Offset(0, 1)
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).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![]()
![]()
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 phiaVầng xong con sẽ sửa lại chỗ này,
Set r = .Range("A1:A" & Lr).Find(BaiHoc).Offset(0, 1).Resize(, 4)
Kiểu giơ cao đánh khẽ thì trẻ nó lại tưởng đánh yêu, nó cười hí hí là chuẩn rồi.Hình như mình mắng mà nó tưởng mình khen, thôi kệ, cho nó miếng động lực![]()
![]()
Tôi làm vui, một cách dùng Power query connect web!"mình" xin được gửi link ạ:
Bài 12: Từ vựng trong Minnano Nihongo | Tổng hợp 50 bài Minna No Nihongo
Minna No Nihongo là cuốn sách được đông đảo người học tiếng Nhật lựa chọn khi mới bắt đầu. Cuốn sách bao gồm nhiều phiên bản hỗ trợ từng kỹ năng tiếng Nhật như Từ vựng, Ngữ pháp, Kanji, hay Đọc hiểu và Nghe hiểu.tiengnhatvn.com
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.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)
Xin chào excel_lv1.5,Tôi làm vui, một cách dùng Power query connect web!
Biết dừng đúng lúc. Câu này khen thậtHô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ú ạ.
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 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á ạ.
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 ạ?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.
Dạ chú, ngại vì còn ít tuổi (cũng già đầu 3Biế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.
Khác nhiều. Mà tôi không muốn nghiên cứu API.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 đã thông tin ạ,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.
' _,
' ___ _ _ _ ___(_)
'/ __| / \ | \| | _ | |
'\__ \/ \ \| \\ | _ \ |
'|___/_/ \_|_|\_|___/_|
'
' 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
Cảm ơn HeSanbi rất nhiều,@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
Nhìn hoành tráng quá anh ạ. :vCode 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
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: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 ạ.
result(count, 0) = lessonName
result(count, 0) = Trim(lessonName)
If c Then result(count, c) = text.innerText
If c Then result(count, c) = Trim(text.innerText)
=COUNTIF($B$2:$B$7320,F4)
Con chào Bác Siwtom,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
thànhMã:result(count, 0) = lessonName
Mã:result(count, 0) = Trim(lessonName)
và sửa
thành.Mã:If c Then result(count, c) = text.innerText
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.
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.Mã:=COUNTIF($B$2:$B$7320,F4)
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
Vui tay viết nhiêu đó thôi. OT có thể nhờ các thành viên khác.
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 ạ.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
thànhMã:result(count, 0) = lessonName
Mã:result(count, 0) = Trim(lessonName)
và sửa
thành.Mã:If c Then result(count, c) = text.innerText
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.
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.Mã:=COUNTIF($B$2:$B$7320,F4)
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
Cảm ơn HeSanbi, vậy OT chúc bạn luôn vui vẻ ạ.Vui tay viết nhiêu đó thôi. OT có thể nhờ các thành viên khác.
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á ahihiHì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ỉ.
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 đã 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.
Ý 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, ...?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 ạ?
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ì ạ.Ý 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, ...?
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.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 ạ.Bài 22: Ngữ pháp trong Minnano Nihongo | Tổng hợp 50 bài Minna No Nihongo
Minna No Nihongo là cuá»n sách ÄÆ°á»£c Äông Äảo ngưá»i há»c tiếng Nháºt lá»±a chá»n khi má»i bắt Äầu. Cuá»n sách bao gá»m nhiá»u phiên bản há» trợ từng kỹ nÄng tiếng Nháºt như Từ vá»±ng, Ngữ pháp, Kanji, hay Äá»c hiá»u và Nghe hiá»u.tiengnhatvn.com
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 ạ.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 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 ạ.
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 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.Bạn đọc kỹ thì sẽ thấy tôi không nói là dán vào bảng tính.
Thế còn câu hỏi của tôi?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.
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.
Con chào Bác,Thế còn câu hỏi của tôi?
Ở 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.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ề ạ.
Con chào Bác Siwtom,Ở 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.
Xin chào HeSanbi,@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 ý.
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.Sub saveGrammarRenshuuCData lỗi tại dòng:
Set ts = fso.CreateTextFile(filename, , True) với tên lỗi:"Path not found"
Con chào Bác Siwtom,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.
![]()
Tieng Nhat
MediaFire is a simple to use free service that lets you put all your photos, documents, music, and video in a single place so you can access them anywhere and share them everywhere.www.mediafire.com
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.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,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.
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.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 ạ.
Dạ vâng con cảm ơn Bác đã thông tin, con xin rút kinh nghiệm ạ.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.
Con chào chú @ptm0412Đú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?
Đố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.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 ạ.
Thôi tôi làm nốt Mondai và RenshuuB. Được hay không thì tôi cũng muốn dừng.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 chào Bác Siwtom,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,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".
Để đơ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.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ả ạ)
Con cảm ơn Bác Siwtom.Để đơ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.
Thay toàn bộ code trong module ON TAP bằng code trong tập tin ONTAP.txtVâng khi nào Bác có thời gian Bác xem giúp con ạ.