Nhờ anh, chị xem code giúp em bị sai chỗ nào mà không chạy được theo ý muốn.

Lê Bá Nhẫn

Yêu THVBA nhất
Em muốn dựa vào 9 kí tự đầu tiên (D6) của Sheet1 dò với 9 kí tự đầu tiên (A7) của Sheet2. Nếu chưa khớp em nào thì sẽ điền vào cột E của Sheet1 là V.

Hinh1:
Hinh2:
Bạn cần đăng nhập để thấy hình ảnh

Bạn cần đăng nhập để thấy hình ảnh

Code của em:
Mã:
Option Explicit
Sub Diem_Danh()
'Phan khai bao bien
Dim DsHs(), i As Long, MeetHS(), Ma_So As Long, tmp As String, Lop As String
'On Error Resume Next
With Sheets("Sheet1")
DsHs = .Range("A6", .Range("A65536").End(3)).Resize(, 4).Value 'lay DS HS
End With
With Sheets("Sheet2")
MeetHS = .Range("A7", .Range("A65536").End(3)).Resize(, 5).Value 'Lay du lieu de xu ly
End With
For i = 1 To UBound(MeetHS) ' duyet tung dong cua du lieu Chat
If MeetHS(i, 1) = Lop Then
If MeetHS(i, 2) <> Empty Then
tmp = MeetHS(i, 4)
tmp = Right(Left(tmp, 10), 2)
'Ma_So = TachSo(tmp)
DsHs(Ma_So, 4) = "V"
End If
End If
Next
Sheets("Sheet1").Range("A6").Resize(UBound(DsHs), UBound(DsHs, 2)) = DsHs
MsgBox "Da Xong.", 64
End Sub
 

NhanSu

SMod
Thành viên BQT
Bạn vào link này mình hướng dẫn cách khắc phục lỗi font khi mở csv. Còn VBA thì mình xem sau.
 

tuhocvba

Administrator
Thành viên BQT
Bạn có thể bớt chút thời gian để trình bày lại cho dễ hiểu không ạ?
  • Nếu bạn không biết cách upload ảnh lên diễn đàn, bạn vui lòng tham khảo topic sau: .
  • Bạn lưu ý phải sử dụng thẻ Code khi viết code trên forum. Xin xem mục 4 trong .
 

tuhocvba

Administrator
Thành viên BQT
Khi được nhắc nhở như vậy, bạn nên tiến hành sửa lại bài viết. Nhưng bạn không tiến hành sửa bài viết. Tôi đã sửa lại bài viết trên của bạn.
Bạn lưu ý không tái diễn ở các bài viết sau.
 

Euler

Administrator
Thành viên BQT
Bạn có nhìn thấy dưới bài viết của bạn có chữ Sửa không?
 

tuhocvba

Administrator
Thành viên BQT
Chủ đề này không cần phải lock thảo luận. Đã nhắc nhở chủ topic rồi. Bạn ấy sẽ rút kinh nghiệm.
 

Lê Bá Nhẫn

Yêu THVBA nhất
@tuhocvba @Euler @NhanSu. Em cảm ơn các anh đã giúp đỡ và nhắc nhỡ.
Do em chưa hiểu cách diễn đạt và chưa hiểu được qui định. Em sẽ rút kinh nghiệm.
Cảm ơn các anh, chị, em trong nhóm đã nhiệt tình chia sẻ kinh nghiệm soạn vba. Em cũng tự học cả tháng nay, nhưng vẫn chưa hiểu được mấy.
Vì không diễn đạt cho dễ hiểu ý muốn của em nên làm mấy anh chị hoang mang. Thật là xin lỗi.
 

NhanSu

SMod
Thành viên BQT
@Lê Bá Nhẫn bạn import file csv chưa đúng. File csv đang dùng utf8 nhưng filesystemobject chỉ làm việc với utf16 nên bị lỗi font. Cách khắc phục:
- C1: Dùng power query ( mình đã hướng dẫn ở chủ đề trước).
- C2: Dùng ADODB.stream (cách này mình không thích lắm, trong diễn đàn có chủ đề này rồi, mình không nhớ link)
- C3: Dùng Excel mở trực tiếp rồi copy paste, mình nghĩ với người mới dùng vba thì nên dùng cách này. Trong code của bạn đang dùng fso.opentextfile, sửa thành Workbooks.OPenText với tham số như sau (chú ý Origin:=65001 và StartRow:=5):
Mã:
Workbooks.OpenText Filename:= _
        "2021-11-17T07_59_47.151Z.csv" _
        , Origin:=65001, StartRow:=5, DataType:=xlDelimited, TextQualifier:= _
        xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
        Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
        TrailingMinusNumbers:=True
- C4: Mình hướng dẫn bạn cách dùng Python. Vào python.org tải về cài đặt. Chạy command prompt rồi đánh các lệnh
pip install pandas
pip install openpyxl
Tạo file LoadCSV.py với nội dung sau (folder csv D:\Data)
Mã:
import pandas as pd
import glob
csv_path = r'D:\Data'
df=pd.DataFrame()
content=[]
all_files = glob.glob(csv_path + '\\*.csv')
for csv_file in all_files:
    df=pd.read_csv(csv_file, index_col = None, header = None, skiprows = 5)
    content.append(df)
df=pd.concat(content, axis = 0, ignore_index = True)
df.to_excel("xxx.xlsx", header = False, index = False)
Bạn có thể tải file rồi copy vào D:\
Double click vào file, python sẽ chạy và tổng hợp các file csv vào D:\xxx.xlsx
 
Sửa lần cuối:

NhanSu

SMod
Thành viên BQT
Tiếp theo, mình viết lại code, sử dụng file xxx.xlsx đã tạo được ở trên. Để hiểu tác dụng của code, bạn bỏ lệnh "r.value=r.value" đi rồi vào sheet để xem công thức (do công thức đơn giản nên mình dùng luôn).
Mã:
Sub Diem_Danh2()
    Dim wb As Workbook, r As Range
    Application.ScreenUpdating = False
    Set wb = Workbooks.Open(ThisWorkbook.Path & "\xxx.xlsx")
    ThisWorkbook.Sheets("Sheet1").Range("E6").Formula = "=IF(ISNA(MATCH(LEFT(D6,9) & ""*"",[xxx.xlsx]Sheet1!$A:$A,0)),""V"","""")"
    Set r = ThisWorkbook.Sheets("Sheet1").Range("E6:E" & ThisWorkbook.Sheets("Sheet1").Range("D10000").End(xlUp).Row)
    r.FillDown
    r.Value = r.Value
    wb.Close False
    Application.ScreenUpdating = True
End Sub
 
Ủa, sao 9 ký tự nhất định phải chứa 10A6 trong đó vậy. Năm sau lớp này lên 11A6, cùng lúc đó bác cũng dạy lớp 10A6 thì lại sáng tác thêm mã mới ah
 

Lê Bá Nhẫn

Yêu THVBA nhất
@vanthanhVBA 9 kí tự này tôi qui định để phân biệt, còn Sở GD không có qui định, làm gì thì cũng được. Nói nhiều lại mất vui. Giải thích: HD là Hòn Đất, 10A6 là lớp 10A6, 01 là số thứ tự tương ứng trong danh sách của học sinh lớp 10A6.
Nhờ anh, em trong nhóm giúp đỡ nên tôi quản lí, điểm danh học online, vào điểm sổ điện tử khỏe hơn trước rồi. Một lần nữa cảm ơn cộng đồng đã giúp đỡ.
 
T

thuthuy2000

Guest
Bác này bảo thủ gớm.
Năm nay 2021, có học trò Ngo Thuy An stt01 học lớp 10A6.
Năm 2022 bạn này lên lớp 11A6.

Cùng năm 2022, học sinh mới vô trường lớp 10A6 cũng có trò là Ngo Thuy An stt01. Giả sử lúc này thầy Nhẫn dạy lớp 11A6 và cả lớp 10A6. Không biết lúc này thầy Nhẫn sẽ tạo ra mã gì cho em.
Bạn cần đăng nhập để thấy hình ảnh

Đã tạo mã thì nên có tính tổng quát, áp dụng lâu dài về sau mà không tạo ra trùng lặp.
 
Top