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

Liên hệ QC

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

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

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,970
Còn tùy form đó chứa gì mà file frx có thể cần hay không.
Trường hợp của bạn là thiếu file .frx đó.
 
Upvote 0
Tập tin frx là dữ liệu cấu thành (binary) của form. Bạn nhìn tập tin frm có biết Form có những control nào, kích thước, vị trí, các thuộc tính như vd. phông chữ không? Có biết là trên form có ListBox, và nó có mấy cột không? Nếu không có frx thì VBA tạo form và các control thế nào được?
 
Upvote 0
Đúng rồi, mình mới thử các form khác nếu ko có frx thì ko import được. Vậy là bó tay luôn phải ko bạn?
 
Upvote 0
Tập tin frx là dữ liệu cấu thành (binary) của form. Bạn nhìn tập tin frm có biết Form có những control nào, kích thước, vị trí, các thuộc tính như vd. phông chữ không? Có biết là trên form có ListBox, và nó có mấy cột không? Nếu không có frx thì VBA tạo form và các control thế nào được?
Đúng rồi, mình mới thử các form khác nếu ko có frx thì ko import được. Vậy là bó tay luôn phải ko bạn?
 
Upvote 0
Nếu không có frx thì không thể import được. Vậy bạn chỉ còn mỗi code thôi. Mở tập tin -> tự thêm UserForm -> bây giờ bạn phải biết UserForm phải có những control gì rồi thả nó từ toolbox xuống form thôi. Rồi thiết các thuộc tính, vd. Name. Sau đó copy code (từ dòng Dim RsDmcv As ADODB.Recordset) từ frm sang.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu không có frx thì không thể import được. Vậy bạn chỉ còn mỗi code thôi. Mở tập tin -> tự thêm UserForm -> bây giờ bạn phải biết UserForm phải có những control gì rồi thả nó từ toolbox xuống form thôi. Rồi thiết các thuộc tính, vd. Name. Sau đó copy code (từ dòng Dim RsDmcv As ADODB.Recordset) từ frm sang.
Mình đang làm thử như vậy nhưng cũng chưa được. Cố gắng thử ( mới tập tành xem code), cám ơn bạn đã xem bài.
 
Upvote 0
Mình đang làm thử như vậy nhưng cũng chưa được.
Sao lại chưa được?
Thêm 1 hay 10 UserForm đều được. Bạn mở tập tin frm bằng notepad, chắc chắn được. Copy từ dòng Dim RsDmcv As ADODB.Recordset chắc chắn bạn làm được. Dán cái đã copy vào module UserForm chắc chắn bạn biết làm.
Chỉ có điều phải biết thả những control nào lên form và thiết lập những thuộc tính nào, thiết lập như thế nào thì tự bạn phải mầy mò vì bạn không có tập tin frx.
Có code cũng là đã may mắn lắm rồi.
 
Upvote 0
Sao lại chưa được?
Thêm 1 hay 10 UserForm đều được. Bạn mở tập tin frm bằng notepad, chắc chắn được. Copy từ dòng Dim RsDmcv As ADODB.Recordset chắc chắn bạn làm được. Dán cái đã copy vào module UserForm chắc chắn bạn biết làm.
Chỉ có điều phải biết thả những control nào lên form và thiết lập những thuộc tính nào, thiết lập như thế nào thì tự bạn phải mầy mò vì bạn không có tập tin frx.
Có code cũng là đã may mắn lắm rồi.
sao khi copy code, cho nó chạy thử. control nào thiếu sẽ được thông báo, rồi từ đó thêm. khó ở cái không biết cần chỉnh thuộc tính như thế nào.
 
Upvote 0
Upvote 0
sao khi copy code, cho nó chạy thử. control nào thiếu sẽ được thông báo, rồi từ đó thêm.
Tất nhiên phải làm thế. Nhưng để làm chuẩn thì nhiều khi bó tay. Vì có thể có Image (chẳng hạn Logo) và rất nhiều Label - vd. tiêu đề các cột của ListBox v...v Những control này không xuất hiện trong code nên thiếu cũng không biết.
Nếu form đơn giản thì mệt ít, form phức tạp thì rất mất thời gian.
 
Upvote 0
Tất nhiên phải làm thế. Nhưng để làm chuẩn thì nhiều khi bó tay. Vì có thể có Image (chẳng hạn Logo) và rất nhiều Label - vd. tiêu đề các cột của ListBox v...v Những control này không xuất hiện trong code nên thiếu cũng không biết.
Nếu form đơn giản thì mệt ít, form phức tạp thì rất mất thời gian.
Hi vọng không phức tạp. Mới ngang listbox mà thấy lỗi tùm lum luôn.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình không rành về VBA mong các Bác giúp mình làm đoạn code về ngày tháng bên dưới với ạ. Em có cột A là ngày tháng giao việc, cột B là thời hạn để hoàn thành việc được giao, cột C là ngày tháng hoàn thành việc được giao. Giờ e muốn tạo code ở cột D (nếu hoàn thành việc được giao đúng hoặc trước hạn thì đánh dấu X, trễ hạn thì để trống) và ở cột E (nếu hoàn thành trễ hạn thì tính ngày trễ hạn so với thời hạn giao việc, nếu đúng hạn thì để trống). Xin các Bác giúp em với ạ, e cảm ơn!
 

File đính kèm

Upvote 0
Mình không rành về VBA mong các Bác giúp mình làm đoạn code về ngày tháng bên dưới với ạ. Em có cột A là ngày tháng giao việc, cột B là thời hạn để hoàn thành việc được giao, cột C là ngày tháng hoàn thành việc được giao. Giờ e muốn tạo code ở cột D (nếu hoàn thành việc được giao đúng hoặc trước hạn thì đánh dấu X, trễ hạn thì để trống) và ở cột E (nếu hoàn thành trễ hạn thì tính ngày trễ hạn so với thời hạn giao việc, nếu đúng hạn thì để trống). Xin các Bác giúp em với ạ, e cảm ơn!
File của bạn không có Code VBA thì làm sao "xử lý, gỡ rối" trong chuyên mục này? Chỉ có là "viết dùm".
Chuyện này dùng hàm Excel cũng được mà, trừ khi dữ liệu vài ngàn dòng.

PHP:
D3=IF((C3-A3)<=B3;"X";"")
E3=IF(D3="";C3-A3-B3;"")
'Copy xuống mõi tay thì thôi'
 
Upvote 0
File của bạn không có Code VBA thì làm sao "xử lý, gỡ rối" trong chuyên mục này? Chỉ có là "viết dùm".
Chuyện này dùng hàm Excel cũng được mà, trừ khi dữ liệu vài ngàn dòng.

PHP:
D3=IF((C3-A3)<=B3;"X";"")
E3=IF(D3="";C3-A3-B3;"")
'Copy xuống mõi tay thì thôi'
Cảm ơn bạn, dùng hàm thì mình làm được nhưng dung lượng quá nặng vì mình làm tới trên cả ngàn dòng. Mình thì không biết về code nên lên đây nhờ ae giúp hộ.
 
Upvote 0
1./ Đó là thầy Ba Tê nhắc bạn đừng xen ngang bài lần sau;
2./
PHP:
Sub ThoiHanThucHien()
 Dim Rws As Long, J As Long, Tre As Integer

 Rws = [B2].End(xlDown).Row
 If Rws < 3 Then Exit Sub
 For J = 3 To Rws
    With Cells(J, "A")
        Tre = .Offset(, 2).Value - (.Value + .Offset(, 1).Value)
        If Tre < 1 Then
            .Offset(, 3).Value = "GPE.COM"
        Else
            .Offset(, 4).Value = Tre
        End If
    End With
 Next J
End Sub
 
Upvote 0
1./ Đó là thầy Ba Tê nhắc bạn đừng xen ngang bài lần sau;
2./
PHP:
Sub ThoiHanThucHien()
 Dim Rws As Long, J As Long, Tre As Integer

 Rws = [B2].End(xlDown).Row
 If Rws < 3 Then Exit Sub
 For J = 3 To Rws
    With Cells(J, "A")
        Tre = .Offset(, 2).Value - (.Value + .Offset(, 1).Value)
        If Tre < 1 Then
            .Offset(, 3).Value = "GPE.COM"
        Else
            .Offset(, 4).Value = Tre
        End If
    End With
 Next J
End Sub
Cảm ơn bạn rất nhiều.
 
Upvote 0
Tôi tạo một combobox nhập liệu theo hướng dẫn của một bạn nhưng không hiểu sao, cứ mỗi lần nhập một giá trị bất kỳ vào một ô bất kỳ trong sheet1 thì combobox lại hiện ra list mà mình tìm kiếm trước đó, điều này rất phiền phức. Mình gửi file nhờ mọi người xem và góp ý giúp.
 

File đính kèm

Upvote 0
Nhờ anh chị xem giúp code sau thiếu gì mà bị lỗi "variable not defined" khi click vào nút "chen"
 

File đính kèm

Upvote 0
Nhờ anh chị xem giúp code sau thiếu gì mà bị lỗi "variable not defined" khi click vào nút "chen"
Lỗi variable not defined là chưa khai báo biến. Bạn chạy bằng F8 thì đến dòng nó báo thông báo đó bạn kiểm tra lại xem biến nào chưa khai báo.
Một cách nữa bạn chèn dòng Option Explicit trước toàn bộ code thì nó sẽ báo lỗi vị trí. Mình không thích tải file về vì sẽ tạo ra nhiều file rác nên, chỉ góp ý trên những gì mình biết thôi.
 
Upvote 0
Lỗi variable not defined là chưa khai báo biến. Bạn chạy bằng F8 thì đến dòng nó báo thông báo đó bạn kiểm tra lại xem biến nào chưa khai báo.
Một cách nữa bạn chèn dòng Option Explicit trước toàn bộ code thì nó sẽ báo lỗi vị trí. Mình không thích tải file về vì sẽ tạo ra nhiều file rác nên, chỉ góp ý trên những gì mình biết thôi.
Lỗi ở dòng màu đỏ đó bạn.
Private Sub CmdChen_Click()
'Dim i As Long
Application.ScreenUpdating = False
For i = 0 To LstDMCV.ListCount - 1
If LstDMCV.Selected(i) Then
ChenMaDonGia LstDMCV.List(i, 0), ActiveCell.Row
Cells(ActiveCell.Row + 1, ActiveCell.Column).Select
If ActiveCell.Row = BotRow - 2 Then
Rows(ActiveCell.Row).Select
Selection.Copy
Cells(ActiveCell.Row, 1).Select
Selection.Insert Shift:=xlDown
Application.CutCopyMode = False
End If
End If
Next
Application.ScreenUpdating = True

End Sub
 
Upvote 0
Lỗi ở dòng màu đỏ đó bạn.
Private Sub CmdChen_Click()
'Dim i As Long
Application.ScreenUpdating = False
For i = 0 To LstDMCV.ListCount - 1
If LstDMCV.Selected(i) Then
ChenMaDonGia LstDMCV.List(i, 0), ActiveCell.Row
Cells(ActiveCell.Row + 1, ActiveCell.Column).Select
If ActiveCell.Row = BotRow - 2 Then
Rows(ActiveCell.Row).Select
Selection.Copy
Cells(ActiveCell.Row, 1).Select
Selection.Insert Shift:=xlDown
Application.CutCopyMode = False
End If
End If
Next
Application.ScreenUpdating = True

End Sub
đổi tên cái listbox trong form thành lstdmcv
 
Upvote 0
Lỗi ở dòng màu đỏ đó bạn.
Private Sub CmdChen_Click()
'Dim i As Long
Application.ScreenUpdating = False
For i = 0 To LstDMCV.ListCount - 1
If LstDMCV.Selected(i) Then
ChenMaDonGia LstDMCV.List(i, 0), ActiveCell.Row
Cells(ActiveCell.Row + 1, ActiveCell.Column).Select
If ActiveCell.Row = BotRow - 2 Then
Rows(ActiveCell.Row).Select
Selection.Copy
Cells(ActiveCell.Row, 1).Select
Selection.Insert Shift:=xlDown
Application.CutCopyMode = False
End If
End If
Next
Application.ScreenUpdating = True

End Sub

Tại sao chỗ khai báo Dim i as Long lại để dấu comment ' vậy
 
Upvote 0
Nếu thêm biên dim As Long vào thì lỗi tiếp ở dòng ChenMaDonGia.......
Code trong file bạn làm thiếu thốn đủ thử, do là bản chế lại nên nó thế. cái dim i as long là phải có. Do sự thiếu thốn đó mà cứ sửa hết lỗi này thì lỗi mới lại xuất hiện. Cụ thể là cái ChenMaDonGia cũng không có trong code. Tìm trong file gốc xem có cái ChenMaDonGia không thì copy nó vào là được, nhưng chắc chắn là lại xuất hiện các lỗi mới. NÓi cung là còn dài dài.

TxtMDG,CheckCmdThem,LblTongSo ..... đều chưa định nghịa nghĩa. Vào menu debug , rồi click vào cái đầu tiên để xem thêm những cái chưa định nghĩa và định nghĩa cho nó.
 
Upvote 0
Code trong file bạn làm thiếu thốn đủ thử, do là bản chế lại nên nó thế. cái dim i as long là phải có. Do sự thiếu thốn đó mà cứ sửa hết lỗi này thì lỗi mới lại xuất hiện. Cụ thể là cái ChenMaDonGia cũng không có trong code. Tìm trong file gốc xem có cái ChenMaDonGia không thì copy nó vào là được, nhưng chắc chắn là lại xuất hiện các lỗi mới. NÓi cung là còn dài dài.
Mình đã làm được nút "chen" rồi, cám ơn bạn.
Do mình có code và file frm + trình độ con gà, nữa nên 3 nút đó mình chưa làm được (TxtMDG,CheckCmdThem,LblTongSo ..... đều chưa định nghịa nghĩa)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Code trong file bạn làm thiếu thốn đủ thử, do là bản chế lại nên nó thế. cái dim i as long là phải có. Do sự thiếu thốn đó mà cứ sửa hết lỗi này thì lỗi mới lại xuất hiện. Cụ thể là cái ChenMaDonGia cũng không có trong code. Tìm trong file gốc xem có cái ChenMaDonGia không thì copy nó vào là được, nhưng chắc chắn là lại xuất hiện các lỗi mới. NÓi cung là còn dài dài.

TxtMDG,CheckCmdThem,LblTongSo ..... đều chưa định nghịa nghĩa. Vào menu debug , rồi click vào cái đầu tiên để xem thêm những cái chưa định nghĩa và định nghĩa cho nó.
Mình đã làm được nút "chen" rồi, cám ơn bạn.
Do mình có code và file frm + trình độ con gà, nữa nên 3 nút đó mình chưa làm được (TxtMDG,CheckCmdThem,LblTongSo ..... đều chưa định nghịa nghĩa)[/QUOTE]
 
Upvote 0
Upvote 0
Private Sub CheckCmdThem()
If TxtMDG.Text <> "" And TxtTenCV.Text <> "" And TxtDVT.Text <> "" _
And TxtMaDM.Text <> "" And (TxtVL.Text <> "" Or TxtNC.Text <> "" Or TxtMay.Text <> "") Then
CmdThem.Enabled = True
Else
CmdThem.Enabled = False
End If
End Sub


Cái này là textbox, đổi tên nó như listbox là được.
Đoạn code này nghĩa là gì vậy bạn?
Private Sub OnOffTxt(Ebl As Boolean)
Dim Ctl As Control
For Each Ctl In Me.Controls
If Ctl.TabIndex >= 3 And Ctl.TabIndex <= 8 Then
Ctl.Enabled = Ebl
End If
Next
End Sub
 
Upvote 0
Đoạn code này nghĩa là gì vậy bạn?
Private Sub OnOffTxt(Ebl As Boolean)
Dim Ctl As Control
For Each Ctl In Me.Controls
If Ctl.TabIndex >= 3 And Ctl.TabIndex <= 8 Then
Ctl.Enabled = Ebl
End If
Next
End Sub
Đoán là vô hiệu hóa hay cho phép các textbox làm việc. Tìm hiểu cái thuộc tính TabIndex sẽ rõ hơn.
 
Upvote 0
Đoán là vô hiệu hóa hay cho phép các textbox làm việc. Tìm hiểu cái thuộc tính TabIndex sẽ rõ hơn.
Bạn
Đoán là vô hiệu hóa hay cho phép các textbox làm việc. Tìm hiểu cái thuộc tính TabIndex sẽ rõ hơn.
Làm thế nào để chạy được code bắt đầu thủ tục "Public Sub......." vậy bạn?
 
Upvote 0
Ví dụ với đoạn code sau, mình không đưa vào macro được.
Public Sub PhanTichVT(StrSL As String, Rn As Range)
Dim RnDT As Long, RnVT As Long 'Dòng b?t d?u c?a m?ng d? li?u trong b?ng DTCT và b?ng PTVT'
'StrSL là chu?i báo hi?u cho ta bi?t c?n phân tích nh?ng thành ph?n nào'
If StrSL = "" Then Exit Sub 'Không có phân thành ph?n nào du?c ch?n'
Dim MaDinhMuc As String
Sheets("DTCT").Select
RnDT = Rn.Row 'Rn là vùng d? li?u ch?a các công vi?c c?n phân tích trong b?ng DTCT'
Dim StrSelect As String
If InStr(StrSL, "NC") <> 0 And InStr(StrSL, "MAY") <> 0 Then 'Có phân tích nhân công và máy thi công'
StrSelect = " and (DanhMucVatTu.DONVI='Công' or DanhMucVatTu.DONVI='Ca')"
ElseIf InStr(StrSL, "NC") <> 0 And InStr(StrSL, "MAY") = 0 Then 'Ch? phân tích nhân công
StrSelect = " and DanhMucVatTu.DONVI = 'Công'"
ElseIf InStr(StrSL, "NC") = 0 And InStr(StrSL, "MAY") <> 0 Then 'Ch? phân tích máy thi công
StrSelect = " and DanhMucVatTu.DONVI = 'Ca'"
End If
RnVT = 5
While RnDT <= Rn.Rows.Count + Rn.Row - 1
If Cells(RnDT, 1).Value = "" Then
Cells(RnDT, 1).End(xlDown).Select
RnDT = ActiveCell.Row
End If
MaDinhMuc = Cells(RnDT, 3).Value
If MaDinhMuc <> "" Then
Dim KhoiLuongCV As String 'Ð?a ch? ch?a kh?i lu?ng công vi?c'
With Sheets(PTVT)
.Cells(RnVT, 1).Value = Cells(RnDT, 1).Value
.Cells(RnVT, 3).Value = Cells(RnDT, 4).Value
.Cells(RnVT, 4).Value = Cells(RnDT, 5).Value
.Cells(RnVT, 5).Value = Cells(RnDT, 6).Value
End With
KhoiLuongCV = Replace(Cells(RnVT, 5).Address, "$", "")
If DbConDM Is Nothing Then
Set DbConDM = CreateObject("ADODB.Connection")
DbConDM.Open "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.Path & "\DinhMuc24.mdb"
End If
If RsVT Is Nothing Then Set RsVT = CreateObject("ADODB.RecordSet")
If Cells(RnDT, 2).Value <> "" And FormPhanTichVatTu.ChkVL.Value = True Then 'Checkbox trên form, có th? thay th? b?ng di?u ki?n khác'
'Có s? d?ng v?a'
TruyVanVua MaDinhMuc, Cells(RnDT, 2).Value, KhoiLuongCV
ElseIf FormPhanTichVatTu.ChkVL.Value = True Then
'Khong su dung vua va co phan tich vat lieu'
VatLieuKhac MaDinhMuc, KhoiLuongCV, RnVT
End If
'Truy xuat nhan cong, may'
If FormPhanTichVatTu.ChkNC.Value = True Or FormPhanTichVatTu.ChkMay.Value = True Then
NhanCongMay MaDinhMuc, KhoiLuongCV, RnVT, StrSelect
End If
RnVT = RnVT + 1
End If
With FormPhanTichVatTu.Prg 'Progressbar theo dõi ti?n trình'
If .Value + 1 <= .Max Then .Value = .Value + 1
End With
Cells(RnDT + 1, 1).Select
If Cells(RnDT + 1, 1).Value = "" Then ActiveCell.End(xlDown).Select
RnDT = ActiveCell.Row
Wend
Set RsVT = Nothing
Cells(1, 1).Select
End Sub
Private Sub TruyVanVua(Ma_DM As String, Ma_Vua As String, KLCV As String)
'Cái này có v? chua ?n l?m vì tôi nghi s? có cách s? d?ng câu l?nh SELECT t?i uu hon'
Dim RsDMV As ADODB.Recordset
Set RsDMV = CreateObject("ADODB.RecordSet")
RsDMV.Open "SELECT DinhMucDuToan.MAVT, DinhMucDuToan.KLVT FROM DinhMucDuToan, DanhMucVatTu Where (DinhMucDuToan.MADM = '" & Ma_DM & _
"') and DanhMucVatTu.MAVT=DinhMucDuToan.MAVT and instr(DanhMucVatTu.TENVT, 'V" & ChrW(7919) & "a')=1", DbConDM, adOpenKeyset, adLockPessimistic
If RsDMV.RecordCount = 0 Then Exit Sub
RsDMV.MoveFirst
While Not RsDMV.EOF
RsVT.Open "Select PhuLucVua.MAVT, DanhMucVatTu.TENVT, DanhMucVatTu.DONVI, ''" & _
",PhuLucVua.KLVT, '' From PhuLucVua, DanhMucVatTu Where (PhuLucVua.MAVUA = '" & _
Ma_Vua & "' ) And PhuLucVua.MAVT = DanhMucVatTu.MAVT", DbConDM, adOpenKeyset, adLockPessimistic
If RsVT.RecordCount > 0 Then
ChenDuLieu KLCV
VatLieuKhac Ma_DM, KLCV, RnVT
End If
RsDMV.MoveNext
Wend
RsDMV.Close
Set RsDMV = Nothing
End Sub
Private Sub VatLieuKhac(Ma_DM As String, KLCV As String, RnVT As Long)
RsVT.Open "SELECT DinhMucDuToan.MAVT,DanhMucVatTu.TENVT,DanhMucVatTu.DONVI, '', " & _
"DinhMucDuToan.KLVT FROM DinhMucDuToan, DanhMucVatTu Where DinhMucDuToan.MADM = '" & Ma_DM & _
"' and DanhMucVatTu.MAVT=DinhMucDuToan.MAVT and DanhMucVatTu.DONVI<>'Công' and DanhMucVatTu.DONVI<>'Ca'", DbConDM, adOpenKeyset, adLockPessimistic
If RsVT.RecordCount = 0 Then RsVT.Close: Exit Sub
ChenDuLieu KLCV
End Sub
Private Sub NhanCongMay(Ma_DM As String, KLCV As String, RnVT As Long, StrNC_MAY As String)
RsVT.Open "SELECT DinhMucDuToan.MAVT,DanhMucVatTu.TENVT,DanhMucVatTu.DONVI, '', " & _
"DinhMucDuToan.KLVT FROM DinhMucDuToan, DanhMucVatTu Where DinhMucDuToan.MADM = '" & Ma_DM & _
"' and DanhMucVatTu.MAVT=DinhMucDuToan.MAVT " & StrNC_MAY, DbConDM, adOpenKeyset, adLockPessimistic
If RsVT.RecordCount = 0 Then RsVT.Close: Exit Sub
ChenDuLieu KLCV
End Sub
Private Sub ChenDuLieu(KLCV As String)
Dim I As Integer
I = 1
Sheets(PTVT).Cells(RnVT + 1, 2).CopyFromRecordset RsVT
RsVT.MoveFirst
While Not RsVT.EOF
Sheets(PTVT).Cells(RnVT + I, 7).Value = "=Round(" & KLCV & "*F" & RnVT + I & ",3)"
I = I + 1
RsVT.MoveNext
Wend
RnVT = Sheets(PTVT).Cells(65536, 2).End(xlUp).Row
RsVT.Close
End Sub
 
Upvote 0
Ví dụ với đoạn code sau, mình không đưa vào macro được.
Public Sub PhanTichVT(StrSL As String, Rn As Range)
Dim RnDT As Long, RnVT As Long 'Dòng b?t d?u c?a m?ng d? li?u trong b?ng DTCT và b?ng PTVT'
'StrSL là chu?i báo hi?u cho ta bi?t c?n phân tích nh?ng thành ph?n nào'
If StrSL = "" Then Exit Sub 'Không có phân thành ph?n nào du?c ch?n'
Dim MaDinhMuc As String
Sheets("DTCT").Select
RnDT = Rn.Row 'Rn là vùng d? li?u ch?a các công vi?c c?n phân tích trong b?ng DTCT'
Dim StrSelect As String
If InStr(StrSL, "NC") <> 0 And InStr(StrSL, "MAY") <> 0 Then 'Có phân tích nhân công và máy thi công'
StrSelect = " and (DanhMucVatTu.DONVI='Công' or DanhMucVatTu.DONVI='Ca')"
ElseIf InStr(StrSL, "NC") <> 0 And InStr(StrSL, "MAY") = 0 Then 'Ch? phân tích nhân công
StrSelect = " and DanhMucVatTu.DONVI = 'Công'"
ElseIf InStr(StrSL, "NC") = 0 And InStr(StrSL, "MAY") <> 0 Then 'Ch? phân tích máy thi công
StrSelect = " and DanhMucVatTu.DONVI = 'Ca'"
End If
RnVT = 5
While RnDT <= Rn.Rows.Count + Rn.Row - 1
If Cells(RnDT, 1).Value = "" Then
Cells(RnDT, 1).End(xlDown).Select
RnDT = ActiveCell.Row
End If
MaDinhMuc = Cells(RnDT, 3).Value
If MaDinhMuc <> "" Then
Dim KhoiLuongCV As String 'Ð?a ch? ch?a kh?i lu?ng công vi?c'
With Sheets(PTVT)
.Cells(RnVT, 1).Value = Cells(RnDT, 1).Value
.Cells(RnVT, 3).Value = Cells(RnDT, 4).Value
.Cells(RnVT, 4).Value = Cells(RnDT, 5).Value
.Cells(RnVT, 5).Value = Cells(RnDT, 6).Value
End With
KhoiLuongCV = Replace(Cells(RnVT, 5).Address, "$", "")
If DbConDM Is Nothing Then
Set DbConDM = CreateObject("ADODB.Connection")
DbConDM.Open "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.Path & "\DinhMuc24.mdb"
End If
If RsVT Is Nothing Then Set RsVT = CreateObject("ADODB.RecordSet")
If Cells(RnDT, 2).Value <> "" And FormPhanTichVatTu.ChkVL.Value = True Then 'Checkbox trên form, có th? thay th? b?ng di?u ki?n khác'
'Có s? d?ng v?a'
TruyVanVua MaDinhMuc, Cells(RnDT, 2).Value, KhoiLuongCV
ElseIf FormPhanTichVatTu.ChkVL.Value = True Then
'Khong su dung vua va co phan tich vat lieu'
VatLieuKhac MaDinhMuc, KhoiLuongCV, RnVT
End If
'Truy xuat nhan cong, may'
If FormPhanTichVatTu.ChkNC.Value = True Or FormPhanTichVatTu.ChkMay.Value = True Then
NhanCongMay MaDinhMuc, KhoiLuongCV, RnVT, StrSelect
End If
RnVT = RnVT + 1
End If
With FormPhanTichVatTu.Prg 'Progressbar theo dõi ti?n trình'
If .Value + 1 <= .Max Then .Value = .Value + 1
End With
Cells(RnDT + 1, 1).Select
If Cells(RnDT + 1, 1).Value = "" Then ActiveCell.End(xlDown).Select
RnDT = ActiveCell.Row
Wend
Set RsVT = Nothing
Cells(1, 1).Select
End Sub
Private Sub TruyVanVua(Ma_DM As String, Ma_Vua As String, KLCV As String)
'Cái này có v? chua ?n l?m vì tôi nghi s? có cách s? d?ng câu l?nh SELECT t?i uu hon'
Dim RsDMV As ADODB.Recordset
Set RsDMV = CreateObject("ADODB.RecordSet")
RsDMV.Open "SELECT DinhMucDuToan.MAVT, DinhMucDuToan.KLVT FROM DinhMucDuToan, DanhMucVatTu Where (DinhMucDuToan.MADM = '" & Ma_DM & _
"') and DanhMucVatTu.MAVT=DinhMucDuToan.MAVT and instr(DanhMucVatTu.TENVT, 'V" & ChrW(7919) & "a')=1", DbConDM, adOpenKeyset, adLockPessimistic
If RsDMV.RecordCount = 0 Then Exit Sub
RsDMV.MoveFirst
While Not RsDMV.EOF
RsVT.Open "Select PhuLucVua.MAVT, DanhMucVatTu.TENVT, DanhMucVatTu.DONVI, ''" & _
",PhuLucVua.KLVT, '' From PhuLucVua, DanhMucVatTu Where (PhuLucVua.MAVUA = '" & _
Ma_Vua & "' ) And PhuLucVua.MAVT = DanhMucVatTu.MAVT", DbConDM, adOpenKeyset, adLockPessimistic
If RsVT.RecordCount > 0 Then
ChenDuLieu KLCV
VatLieuKhac Ma_DM, KLCV, RnVT
End If
RsDMV.MoveNext
Wend
RsDMV.Close
Set RsDMV = Nothing
End Sub
Private Sub VatLieuKhac(Ma_DM As String, KLCV As String, RnVT As Long)
RsVT.Open "SELECT DinhMucDuToan.MAVT,DanhMucVatTu.TENVT,DanhMucVatTu.DONVI, '', " & _
"DinhMucDuToan.KLVT FROM DinhMucDuToan, DanhMucVatTu Where DinhMucDuToan.MADM = '" & Ma_DM & _
"' and DanhMucVatTu.MAVT=DinhMucDuToan.MAVT and DanhMucVatTu.DONVI<>'Công' and DanhMucVatTu.DONVI<>'Ca'", DbConDM, adOpenKeyset, adLockPessimistic
If RsVT.RecordCount = 0 Then RsVT.Close: Exit Sub
ChenDuLieu KLCV
End Sub
Private Sub NhanCongMay(Ma_DM As String, KLCV As String, RnVT As Long, StrNC_MAY As String)
RsVT.Open "SELECT DinhMucDuToan.MAVT,DanhMucVatTu.TENVT,DanhMucVatTu.DONVI, '', " & _
"DinhMucDuToan.KLVT FROM DinhMucDuToan, DanhMucVatTu Where DinhMucDuToan.MADM = '" & Ma_DM & _
"' and DanhMucVatTu.MAVT=DinhMucDuToan.MAVT " & StrNC_MAY, DbConDM, adOpenKeyset, adLockPessimistic
If RsVT.RecordCount = 0 Then RsVT.Close: Exit Sub
ChenDuLieu KLCV
End Sub
Private Sub ChenDuLieu(KLCV As String)
Dim I As Integer
I = 1
Sheets(PTVT).Cells(RnVT + 1, 2).CopyFromRecordset RsVT
RsVT.MoveFirst
While Not RsVT.EOF
Sheets(PTVT).Cells(RnVT + I, 7).Value = "=Round(" & KLCV & "*F" & RnVT + I & ",3)"
I = I + 1
RsVT.MoveNext
Wend
RnVT = Sheets(PTVT).Cells(65536, 2).End(xlUp).Row
RsVT.Close
End Sub
Mình thấy bạn nên lập một bài viết mới, nêu rõ hoàn cảnh, nhờ các thành viên khôi phục lại cái form hỏng ý cho. Chứ bạn tự làm chắc phải sang năm mới xong, không hiệu quả. Thớt này chỉ rành cho những vấn đề nổi cộm, code bị lỗi bị vướng ở một vài chỗ thì trao đổi ở đây. Của bạn là một vấn đề lớn quá sức.
 
Upvote 0
Mình thấy bạn nên lập một bài viết mới, nêu rõ hoàn cảnh, nhờ các thành viên khôi phục lại cái form hỏng ý cho. Chứ bạn tự làm chắc phải sang năm mới xong, không hiệu quả. Thớt này chỉ rành cho những vấn đề nổi cộm, code bị lỗi bị vướng ở một vài chỗ thì trao đổi ở đây. Của bạn là một vấn đề lớn quá sức.
Cám ơn bạn đã nhắc, phần form đó cũng tương đối rồi.
 
Upvote 0
Làm thế nào để chạy được code bắt đầu thủ tục "Public Sub......." vậy bạn?
Cái phần ngay sau cái từ Sub là phần quan trọng để xác định cách gọi nó thì bạn cắt gọn mất (xem bên dưới)
Chỉ làm được nếu nó khong có tham số bắt buộc
Ví dụ với đoạn code sau, mình không đưa vào macro được.
Public Sub PhanTichVT(StrSL As String, Rn As Range)
Sub này có cái dãy tham đi kế nó cho nên mỗi lần chạy, nó bắt buộc phải nạp đủ đám tham đó (2 tham). Ví dụ:
PhanTichVT "abc", Range("A1")
Tham thứ nhất là một chuỗi (abc). Tham thứ hai là mọt range (A1)
 
Upvote 0
Chào ace
Em có tìm đc 1 đoạn code chia sẻ trên microsoft và e đang cần sử dụng nó.
Mục đích: tìm và thay thế 1 đoạn văn bản trong nhiều file excel trong 1 thư mục cùng lúc.
hiện tại e đang gặp lỗi
1. sau khi load file excel nhưng ko replace được, ko hiện thông báo done
2. không gõ tiếng việt vào ô tìm kiếm và thay thế đc.
(e đã enable editing all file)
Nhờ ace chỉ giúp ạ
Link gốc: https://answers.microsoft.com/en-us...a/deb409ac-8467-4648-a44d-f1dd47b7d45d?auth=1
Mã:
Sub ReplaceInFolder()
    Dim strPath As String
    Dim strFile As String
    Dim wbk As Workbook
    Dim wsh As Worksheet
    Dim strFind As String
    Dim strReplace As String
    strFind = InputBox("Enter text to find")
    If strFind = "" Then
        MsgBox "No find text specified!", vbExclamation
        Exit Sub
    End If
    strReplace = InputBox("Enter replacement text")
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show Then
            strPath = .SelectedItems(1)
        Else
            MsgBox "No folder selected!", vbExclamation
            Exit Sub
        End If
    End With
    If Right(strPath, 1) <> "\" Then
        strPath = strPath & "\"
    End If
    Application.ScreenUpdating = False
    strFile = Dir(strPath & "*.xls*")
    Do While strFile <> ""
        Set wbk = Workbooks.Open(Filename:=strPath & strFile, AddToMRU:=False)
        For Each wsh In wbk.Worksheets
            wsh.Cells.Replace What:=strFind, Replacement:=strReplace, _
                LookAt:=xlWhole, MatchCase:=False
        Next wsh
        wbk.Close SaveChanges:=True
        strFile = Dir
    Loop
    Application.ScreenUpdating = True
End Sub
 
Upvote 0
Chào ace
Em có tìm đc 1 đoạn code chia sẻ trên microsoft và e đang cần sử dụng nó.
Mục đích: tìm và thay thế 1 đoạn văn bản trong nhiều file excel trong 1 thư mục cùng lúc.
hiện tại e đang gặp lỗi
1. sau khi load file excel nhưng ko replace được, ko hiện thông báo done
2. không gõ tiếng việt vào ô tìm kiếm và thay thế đc.
(e đã enable editing all file)
Nhờ ace chỉ giúp ạ
Link gốc: https://answers.microsoft.com/en-us...a/deb409ac-8467-4648-a44d-f1dd47b7d45d?auth=1
Mã:
Sub ReplaceInFolder()
    Dim strPath As String
    Dim strFile As String
    Dim wbk As Workbook
    Dim wsh As Worksheet
    Dim strFind As String
    Dim strReplace As String
    strFind = InputBox("Enter text to find")
    If strFind = "" Then
        MsgBox "No find text specified!", vbExclamation
        Exit Sub
    End If
    strReplace = InputBox("Enter replacement text")
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show Then
            strPath = .SelectedItems(1)
        Else
            MsgBox "No folder selected!", vbExclamation
            Exit Sub
        End If
    End With
    If Right(strPath, 1) <> "\" Then
        strPath = strPath & "\"
    End If
    Application.ScreenUpdating = False
    strFile = Dir(strPath & "*.xls*")
    Do While strFile <> ""
        Set wbk = Workbooks.Open(Filename:=strPath & strFile, AddToMRU:=False)
        For Each wsh In wbk.Worksheets
            wsh.Cells.Replace What:=strFind, Replacement:=strReplace, _
                LookAt:=xlWhole, MatchCase:=False
        Next wsh
        wbk.Close SaveChanges:=True
        strFile = Dir
    Loop
    Application.ScreenUpdating = True
End Sub
Chổ này nè bạn.
http://www.giaiphapexcel.com/diendan/threads/nhờ-check-macro-find-and-replace-all-file-excel.132629/
 
Upvote 0
Em chào anh, em có rất ít kiến thức về excel, gần đây em có sưu tầm trên mạng được code copy giá trị thành values, nhưng cái code này biến đổi cả những cột và hàng bị filter hoặc hide. Anh có thể sửa cho em để chỉ biến đổi giá trị value vào những dòng visible được không ạ ? Em cám ơn
Sub DisplayedToActual()
'Updateby20131126
Dim Rng As Range
Dim WorkRng As Range
On Error Resume Next
xTitleId = "Hoc Excel Online"
Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
Application.ScreenUpdating = False
For Each Rng In WorkRng
Rng.Value = Rng.Text
Next
Application.ScreenUpdating = True
End Sub
 
Upvote 0
If Rng.Viru
Em chào anh, em có rất ít kiến thức về excel, gần đây em có sưu tầm trên mạng được code copy giá trị thành values, nhưng cái code này biến đổi cả những cột và hàng bị filter hoặc hide. Anh có thể sửa cho em để chỉ biến đổi giá trị value vào những dòng visible được không ạ ? Em cám ơn
Sub DisplayedToActual()
'Updateby20131126
Dim Rng As Range
Dim WorkRng As Range
On Error Resume Next
xTitleId = "Hoc Excel Online"
Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
Application.ScreenUpdating = False
For Each Rng In WorkRng
Rng.Value = Rng.Text
Next
Application.ScreenUpdating = True
End Sub
Đọc kiểu code là biết nguồn của KuTools đem về chế lại.

Code này hoạt động bạn chọn một vùng, sau đó nó sẽ copy và gán lại giá trị từng cell trong vùng đó thành dạng Text.
Nên bạn sẽ kiểm tra xem thuộc tính của cell đó có bị Hidden không bằng code

If Rows(Rng.Row).EntireRow.Hidden = False Then
Rng.Value = Rng.Text
End If
 
Upvote 0
If Rng.Viru

Đọc kiểu code là biết nguồn của KuTools đem về chế lại.

Code này hoạt động bạn chọn một vùng, sau đó nó sẽ copy và gán lại giá trị từng cell trong vùng đó thành dạng Text.
Nên bạn sẽ kiểm tra xem thuộc tính của cell đó có bị Hidden không bằng code

If Rows(Rng.Row).EntireRow.Hidden = False Then
Rng.Value = Rng.Text
End If
Anh ơi, copy cái đoạn code của anh vào đâu hả anh. Anh thông cảm, em biết ít kiến thức lắm. Em chỉ biết copy code đã viết sẵn rồi dùng thui
 
Upvote 0
Anh ơi, copy cái đoạn code của anh vào đâu hả anh. Anh thông cảm, em biết ít kiến thức lắm. Em chỉ biết copy code đã viết sẵn rồi dùng thui
Không biết code mà cứ thích dùng code.
Mã:
Sub DisplayedToActual()
'Updateby20131126
Dim Rng As Range
Dim WorkRng As Range
On Error Resume Next
xTitleId = "Hoc Excel Online"
Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
Application.ScreenUpdating = False
For Each Rng In WorkRng
If Rows(Rng.Row).EntireRow.Hidden = False Then
Rng.Value = Rng.Text
End If
Next
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Không biết code mà cứ thích dùng code.
Mã:
Sub DisplayedToActual()
'Updateby20131126
Dim Rng As Range
Dim WorkRng As Range
On Error Resume Next
xTitleId = "Hoc Excel Online"
Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
Application.ScreenUpdating = False
For Each Rng In WorkRng
If Rows(Rng.Row).EntireRow.Hidden = False Then
Rng.Value = Rng.Text
End If
Next
Application.ScreenUpdating = True
End Sub
Em cám ơn anh. Cho em hỏi ngu thêm câu nữa là, em có sưu tầm đc 2 code để phục vụ công việc ( code này là cái thứ 3 ) em muốn nó thành 1 tool add in (hoặc 3 tool riêng biệt cũng được) trên thanh toolbar để dùng khi cần thì làm như thế nào ạ. Hiện tại cần gì em toàn phải xoá cái cũ đi để thêm cái mới vào
 
Upvote 0
Em cám ơn anh. Cho em hỏi ngu thêm câu nữa là, em có sưu tầm đc 2 code để phục vụ công việc ( code này là cái thứ 3 ) em muốn nó thành 1 tool add in (hoặc 3 tool riêng biệt cũng được) trên thanh toolbar để dùng khi cần thì làm như thế nào ạ. Hiện tại cần gì em toàn phải xoá cái cũ đi để thêm cái mới vào
Cần lên khung search và gõ tool addin bạn :)
 
Upvote 0
Em cám ơn anh. Cho em hỏi ngu thêm câu nữa là, em có sưu tầm đc 2 code để phục vụ công việc ( code này là cái thứ 3 ) em muốn nó thành 1 tool add in (hoặc 3 tool riêng biệt cũng được) trên thanh toolbar để dùng khi cần thì làm như thế nào ạ. Hiện tại cần gì em toàn phải xoá cái cũ đi để thêm cái mới vào
Nếu bạn muốn lưu làm công cụ để tiện thao tác bạn lưu file tên là.XLSA
http://www.giaiphapexcel.com/dienda...ạo-nạp-và-sử-dụng-add-ins-trong-ms-excel.379/
Bạn xem cái này thử !
 
Upvote 0
Tôi là thành viên mới thấy mục này quá hay, bản thân cũng đang tập tành học code, nhưng có 1 số code trong file tôi chưa biết viết thế nào, mong các Bác giúp dùm, cụ thể như sau:
Tôi đang làm 1 file excel để theo dõi đơn nhưng đang vướng chưa biết chuyển hàm thành code cụ thể thế nào, mong các Bác giúp đỡ thêm để tôi hoàn thiện.. Cụ thể theo file gửi kèm tôi chưa biết dùng code thế nào như sau:
- Với Sheet XLD:
+ Nếu các ô tại cột I và cột F của dòng đang nhập liệu khác rỗng và nếu ô tại cột F,H,I khi nhập có dữ liệu trùng với dữ liệu tại cột F,H,I ở dòng trên thì đánh dấu X vào cột Q của dòng đang nhập liệu (khi sửa nội dung dòng bất kỳ mà không trùng nữa thì bỏ dấu X).
+ Và tại cột S đánh dấu X nếu như tại dòng đó mà các cột A,B,C,D,E,F,G,H có dữ liệu và các cột I,J,K,L,M,N,O rỗng.
- Với sheet TD TQUYEN:
+ Nếu cột G khác rỗng và nếu các ô thuộc cột E,G của sheet TD TQUYEN bằng với các ô thuôc cột F,I của sheet XLD thì đếm số ô trùng nhau của cột I thuộc sheet XLD và đưa kết quả vào cột AA của sheet TD TQUYEN tại dòng trùng nhau.

Do dữ liệu tôi nhập rất lớn mà dùng hàm thì file quá nặng mà đang chưa biết viết code như thế nào, mong các Bác giúp đỡ, tôi cảm ơn rất nhiều. (Không biết đăng bài nhờ giúp ở đâu nên đăng ở đây có gì không đúng mong các Bác bỏ qua cho).
 

File đính kèm

Upvote 0
Gửi các anh, chị em
Tôi có lắp ghép được 1 đoạn code vào trong file như file đính kèm với mục đích khi mở file code sẽ rà các ô chỉ định có ngày chênh lệch với ngày hiện tại quá 30 nó sẽ gửi email qua Outlook
Khi code chạy, dù rất nhiều ô thỏa mãn việc phải gửi email, nhưng thực tế chỉ có khoảng 15 ô (15 email) được gửi.
Tôi không biết code thiếu hoặc nhầm cái gì mà không phải tất cả các ô thỏa mãn điều kiện thì được nhắc nhở bằng email
Mong các anh chị em kiểm tra giúp.
Xin cảm ơn
 

File đính kèm

Upvote 0
Chào Anh/Chị trong GPE!

Em có xem trên mạng video về lập trình nhập liệu VBA hay nên đã ứng dụng vào công việc của mình. Do chưa biết gì về VBA nên chỉ làm theo hướng dẫn của video, Khi làm thì có một số lỗi nên đã giải quyết thủ công nên code không được tối ưu,
Nên em Up lên này nhờ Anh/Chị Code lại cho tối ưu giúp em với nhé.
Cảm ơn nhiều!
 

File đính kèm

Upvote 0
Em chào mọi người, em có 1 file excel được export từ phần mềm ra, trước khi đến khâu tính toán thì phải xử lý dữ liệu thô. Mà dữ liệu thì lặp đi lặp lại, em ngồi copy cả ngày mới xong. Em nghe nói excel có macro chuyên xử lý những thao tác lặp đi lặp lại, tuy nhiên em không rõ về nó.
B1. Ở sheet "Before" Em copy toàn bộ cell màu đỏ ở cột G vào cột B tương ứng với thông tin của nhân viên ( cái này lâu nhất ).
B2. Xóa các cột và hàng màu em bôi màu vàng đi cho đỡ rối mắt
B3. Text to colums những mã mà em vừa copy xuống.
Như vậy em có file ở bên Sheet " After ".
Mọi người giúp em với. Em cám ơn.
 

File đính kèm

Upvote 0
Em chào mọi người, em có 1 file excel được export từ phần mềm ra, trước khi đến khâu tính toán thì phải xử lý dữ liệu thô. Mà dữ liệu thì lặp đi lặp lại, em ngồi copy cả ngày mới xong. Em nghe nói excel có macro chuyên xử lý những thao tác lặp đi lặp lại, tuy nhiên em không rõ về nó.
B1. Ở sheet "Before" Em copy toàn bộ cell màu đỏ ở cột G vào cột B tương ứng với thông tin của nhân viên ( cái này lâu nhất ).
B2. Xóa các cột và hàng màu em bôi màu vàng đi cho đỡ rối mắt
B3. Text to colums những mã mà em vừa copy xuống.
Như vậy em có file ở bên Sheet " After ".
Mọi người giúp em với. Em cám ơn.
Xem file
 

File đính kèm

Upvote 0
Tôi là thành viên mới thấy mục này quá hay, bản thân cũng đang tập tành học code, nhưng có 1 số code trong file tôi chưa biết viết thế nào, mong các Bác giúp dùm, cụ thể như sau:
Tôi đang làm 1 file excel để theo dõi đơn nhưng đang vướng chưa biết chuyển hàm thành code cụ thể thế nào, mong các Bác giúp đỡ thêm để tôi hoàn thiện.. Cụ thể theo file gửi kèm tôi chưa biết dùng code thế nào như sau:
- Với Sheet XLD:
+ Nếu các ô tại cột I và cột F của dòng đang nhập liệu khác rỗng và nếu ô tại cột F,H,I khi nhập có dữ liệu trùng với dữ liệu tại cột F,H,I ở dòng trên thì đánh dấu X vào cột Q của dòng đang nhập liệu (khi sửa nội dung dòng bất kỳ mà không trùng nữa thì bỏ dấu X).
+ Và tại cột S đánh dấu X nếu như tại dòng đó mà các cột A,B,C,D,E,F,G,H có dữ liệu và các cột I,J,K,L,M,N,O rỗng.
- Với sheet TD TQUYEN:
+ Nếu cột G khác rỗng và nếu các ô thuộc cột E,G của sheet TD TQUYEN bằng với các ô thuôc cột F,I của sheet XLD thì đếm số ô trùng nhau của cột I thuộc sheet XLD và đưa kết quả vào cột AA của sheet TD TQUYEN tại dòng trùng nhau.

Do dữ liệu tôi nhập rất lớn mà dùng hàm thì file quá nặng mà đang chưa biết viết code như thế nào, mong các Bác giúp đỡ, tôi cảm ơn rất nhiều. (Không biết đăng bài nhờ giúp ở đâu nên đăng ở đây có gì không đúng mong các Bác bỏ qua cho).
Nội dung theo dõi về tố cáo, khiếu nại trước đây (khoảng 7 năm) tôi viết hẳn 1 File theo dõi cho cơ quan, nhưng rất tiếc cơ quan không dùng (lý do đã có phần mềm theo dõi), để tôi tìm lại và sửa cho phù hợp cái bạn cần. Vậy, bạn hãy chờ tôi tìm (giờ không nhớ để nó ở cái xó nào).
 
Upvote 0
Nội dung theo dõi về tố cáo, khiếu nại trước đây (khoảng 7 năm) tôi viết hẳn 1 File theo dõi cho cơ quan, nhưng rất tiếc cơ quan không dùng (lý do đã có phần mềm theo dõi), để tôi tìm lại và sửa cho phù hợp cái bạn cần. Vậy, bạn hãy chờ tôi tìm (giờ không nhớ để nó ở cái xó nào).
Em cám ơn anh, em chưa thấy ở đâu mọi người nhiệt tình như ở GPE :D

Em cám ơn anh. Nhưng mỗi lần em xuất file từ phần mềm ra excel tên sheet sẽ không là "Before" và "After" ( em đặt vậy để trình bày cho mọi người dễ hiểu ). Có cách nào mà mình chạy thì nó cho sang sheet mới không anh ? Cột mã số em làm text to colums theo cột cũng nhanh thôi.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Em cám ơn anh. Nhưng mỗi lần em xuất file từ phần mềm ra excel tên sheet sẽ không là "Before" và "After" ( em đặt vậy để trình bày cho mọi người dễ hiểu ). Có cách nào mà mình chạy thì nó cho sang sheet mới không anh ? Cột mã số em làm text to colums theo cột cũng nhanh thôi.
Tên sheet xuất từ phần mềm cố định hay thay đổi? tên sheet tạo mới đặt tên như thế nào?
 
Upvote 0
Em cám ơn anh. Nhưng mỗi lần em xuất file từ phần mềm ra excel tên sheet sẽ không là "Before" và "After" ( em đặt vậy để trình bày cho mọi người dễ hiểu ). Có cách nào mà mình chạy thì nó cho sang sheet mới không anh ? Cột mã số em làm text to colums theo cột cũng nhanh thôi.
Vậy thì bạn nên đưa vài cái File xuất từ phần mềm ra excel lên đây thử xem, biết quy luật thì mới tính tiếp được.

Lưu ý: Mỗi sheet chứa khoảng 20 dòng dữ liệu là được (còn tên sheet là gì không quan trọng).
 
Upvote 0
Vậy thì bạn nên đưa vài cái File xuất từ phần mềm ra excel lên đây thử xem, biết quy luật thì mới tính tiếp được.

Lưu ý: Mỗi sheet chứa khoảng 20 dòng dữ liệu là được (còn tên sheet là gì không quan trọng).
Tên sheet thì sẽ là tên file mình đặt, mình đặt gì cũng đc. Chỉ có 1 sheet duy nhất giống như sheet “before” đó ạ. Tuy nhiên nếu hiện tại ( dùng code của anh HieuCD ) khi em export file mới, em sẽ phải xoá các cột đi để lấy đc hàng tiêu đề mẫu và copy sang sheet mới và đặt tên là after. Em cám ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Chạy code mới
Mã:
Sub CopyData()
  Dim Rng As Range
  Dim Id As Long, i As Long, lRow As Long
  Const Str = "Personnel Number:"
  Application.ScreenUpdating = False
  Sheets("Before").Copy After:=Sheets(Sheets.Count)
  ActiveSheet.Name = "After" & Sheets.Count - 1 'Chinh lai tên Sheet
 
  lRow = Range("C" & Rows.Count).End(xlUp).Row
  Set Rng = Cells(1, 1)
  For i = 2 To lRow
    If Cells(i, 2) = Str Then Id = Cells(i, 7)
    If IsNumeric(Mid(Cells(i, 3), 1, 2)) Then
      Cells(i, 2) = Id
    Else
      If i <> 11 Then Set Rng = Union(Rng, Cells(i, 1))
    End If
  Next i
  Rng.EntireRow.Delete
  Range("A:A,E:E,I:I,N:N,P:P,R:X,Z:Z,AB:AB,AD:AF,AO:AQ,BA:BA").EntireColumn.Delete
  Set Rng = Nothing
  Application.ScreenUpdating = True
End Sub
 

File đính kèm

Upvote 0
Xin chào các bạn

Tôi có một đoạn code như sau:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row >= 9 And Target.Row <= 16 And Target.Column = 6 Then
With Target.Offset(, -2)
.FormulaR1C1 = "=RC[2]"
.Value = .Value
End With
End If
If Target.Row >= 9 And Target.Row <= 16 And Target.Column = 4 Then
With Target.Offset(, 2)
.FormulaR1C1 = "=RC[-2]"
.Value = .Value
End With
End If
End Sub

Nếu tôi xóa 1 trong 2 cái If thì code chạy không vấn đề gì, nhưng khi tôi để cả 2 cái if cùng chạy thì code bị lỗi.

Nhờ các bạn xử lý giúp ạ.
 

File đính kèm

Upvote 0
Xin chào các bạn

Tôi có một đoạn code như sau:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row >= 9 And Target.Row <= 16 And Target.Column = 6 Then
With Target.Offset(, -2)
.FormulaR1C1 = "=RC[2]"
.Value = .Value
End With
End If
If Target.Row >= 9 And Target.Row <= 16 And Target.Column = 4 Then
With Target.Offset(, 2)
.FormulaR1C1 = "=RC[-2]"
.Value = .Value
End With
End If
End Sub

Nếu tôi xóa 1 trong 2 cái If thì code chạy không vấn đề gì, nhưng khi tôi để cả 2 cái if cùng chạy thì code bị lỗi.

Nhờ các bạn xử lý giúp ạ.
Code vậy không được vì sẽ bị tham chiếu vòng. Cứ gán giá trị trực tiếp luôn thay vì gán công thức
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Application.EnableEvents = False
  If Target.Row >= 9 And Target.Row <= 16 Then
    If Target.Column = 6 Then Target.Offset(, -2).Value = Target.Value
    If Target.Column = 4 Then Target.Offset(, 2).Value = Target.Value
  End If
  Application.EnableEvents = True
End Sub
 
Upvote 0
Code vậy không được vì sẽ bị tham chiếu vòng. Cứ gán giá trị trực tiếp luôn thay vì gán công thức
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Application.EnableEvents = False
  If Target.Row >= 9 And Target.Row <= 16 Then
    If Target.Column = 6 Then Target.Offset(, -2).Value = Target.Value
    If Target.Column = 4 Then Target.Offset(, 2).Value = Target.Value
  End If
  Application.EnableEvents = True
End Sub

Cảm ơn ndu96081631 đã giúp đỡ.
Nhờ bạn xử lý giúp tôi cho trường hợp này ạ.
 

File đính kèm

Upvote 0
Cảm ơn ndu96081631 đã giúp đỡ.
Nhờ bạn xử lý giúp tôi cho trường hợp này ạ.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Target.Row >= 9 And Target.Row <= 16 Then
    If Target.Column = 6 Then
        With Target.Offset(, -2)
            .FormulaR1C1 = "=INDEX(R9C10:R16C10,MATCH(RC[2],R9C11:R16C11,0))"
            .Value = .Value
        End With
    End If
    If Target.Column = 4 Then
        With Target.Offset(, 2)
            .FormulaR1C1 = "=INDEX(R9C11:R16C11,MATCH(RC[-2],R9C10:R16C10,0))"
            .Value = .Value
        End With
    End If
End If
Application.EnableEvents = True
End Sub
 
Upvote 0
Nội dung theo dõi về tố cáo, khiếu nại trước đây (khoảng 7 năm) tôi viết hẳn 1 File theo dõi cho cơ quan, nhưng rất tiếc cơ quan không dùng (lý do đã có phần mềm theo dõi), để tôi tìm lại và sửa cho phù hợp cái bạn cần. Vậy, bạn hãy chờ tôi tìm (giờ không nhớ để nó ở cái xó nào).
Cảm ơn bạn.
 
Upvote 0
Cảm ơn ndu96081631 đã giúp đỡ.
Nhờ bạn xử lý giúp tôi cho trường hợp này ạ.
Vẫn quan điểm ở trên: Tuyệt đối không nên gán công thức vào Target khi thực hiện sự kiện Change (dễ bị lỗi) mà nên tính toán trực tiếp trong code
Ví dụ:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rngFind As Range, cel As Range
  Dim lOffset1 As Long, lOffset2 As Long, lOffset3 As Long
  Application.EnableEvents = False
  On Error Resume Next
  If Target.Row >= 9 And Target.Row <= 16 Then
    If Target.Column = 4 Then lOffset1 = 1
    If Target.Column = 6 Then lOffset1 = -1
    If lOffset1 Then
      lOffset2 = (1 - lOffset1) / 2
      lOffset3 = lOffset1 * 2
      For Each cel In Target
        If cel.Column = 4 Or cel.Column = 6 Then
          Set rngFind = Range("DANHSACH").Resize(, 1).Offset(, lOffset2).Find(cel.Value, , xlValues, xlWhole)
          If Not rngFind Is Nothing Then
            cel.Offset(, lOffset3).Value = rngFind.Offset(, lOffset1).Value
          Else
            cel.Offset(, lOffset3).ClearContents
          End If
        End If
      Next
    End If
  End If
  If Err.Number Then MsgBox Err.Description
  Application.EnableEvents = True
End Sub
Trong đó:
- DANHSACH chính là Define name của vùng J9:K16 (bạn tự đặt)
- lOffset1, lOffset2 và lOffset3 là các con số dùng để dịch chuyển cột sang trái hoặc phải (tự tính cho phù hợp)
----------------------------------
Ngoài ra có 1 lưu ý quan trọng: Khi sự kiện Change thực hiện sự thay đổi ngay trên Target thì bắt buộc phải có cặp lệnh: Application.EnableEvents = False ở đầu code và Application.EnableEvents = True ở cuối code, nếu không sẽ có lúc rơi vào "vòng lập vô tân". Có nghĩa là:
- Khi ta thay đổi trên sheet thì code sự kiện sẽ chạy
- Code chạy làm thay đổi giá trị trên sheet
- Sự thay đổi giá trị trên sheet mà giá trị này nằm ngay vùng Target sẽ làm code chạy tiếp

.... cứ thế mãi không ngừng đến lúc treo máy mới thôi
----------------------------------
Code ở trên dài thế vì:
- Nó còn làm được việc cho phép copy paste nhiều cell cùng lúc
- Khi xóa cột này thì cột kia sẽ bị xóa theo
- vân vân...
 

File đính kèm

Upvote 0
Vẫn quan điểm ở trên: Tuyệt đối không nên gán công thức vào Target khi thực hiện sự kiện Change (dễ bị lỗi) mà nên tính toán trực tiếp trong code
Ví dụ:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rngFind As Range, cel As Range
  Dim lOffset1 As Long, lOffset2 As Long, lOffset3 As Long
  Application.EnableEvents = False
  On Error Resume Next
  If Target.Row >= 9 And Target.Row <= 16 Then
    If Target.Column = 4 Then lOffset1 = 1
    If Target.Column = 6 Then lOffset1 = -1
    If lOffset1 Then
      lOffset2 = (1 - lOffset1) / 2
      lOffset3 = lOffset1 * 2
      For Each cel In Target
        If cel.Column = 4 Or cel.Column = 6 Then
          Set rngFind = Range("DANHSACH").Resize(, 1).Offset(, lOffset2).Find(cel.Value, , xlValues, xlWhole)
          If Not rngFind Is Nothing Then
            cel.Offset(, lOffset3).Value = rngFind.Offset(, lOffset1).Value
          Else
            cel.Offset(, lOffset3).ClearContents
          End If
        End If
      Next
    End If
  End If
  If Err.Number Then MsgBox Err.Description
  Application.EnableEvents = True
End Sub
Trong đó:
- DANHSACH chính là Define name của vùng J9:K16 (bạn tự đặt)
- lOffset1, lOffset2 và lOffset3 là các con số dùng để dịch chuyển cột sang trái hoặc phải (tự tính cho phù hợp)
----------------------------------
Ngoài ra có 1 lưu ý quan trọng: Khi sự kiện Change thực hiện sự thay đổi ngay trên Target thì bắt buộc phải có cặp lệnh: Application.EnableEvents = False ở đầu code và Application.EnableEvents = True ở cuối code, nếu không sẽ có lúc rơi vào "vòng lập vô tân". Có nghĩa là:
- Khi ta thay đổi trên sheet thì code sự kiện sẽ chạy
- Code chạy làm thay đổi giá trị trên sheet
- Sự thay đổi giá trị trên sheet mà giá trị này nằm ngay vùng Target sẽ làm code chạy tiếp

.... cứ thế mãi không ngừng đến lúc treo máy mới thôi
----------------------------------
Code ở trên dài thế vì:
- Nó còn làm được việc cho phép copy paste nhiều cell cùng lúc
- Khi xóa cột này thì cột kia sẽ bị xóa theo
- vân vân...

Cảm ndu96081631 nhiều nhé,
ở bài trước Oanh Thơ định thắc mắc về Application.EnableEvents = False chưa kịp hỏi thì đã được bạn giải thích rõ ràng và giúp đỡ phương pháp tối hơn.
Khi áp dụng nếu có vấn đề gì rất mong lại được hỗ trợ ạ.
 
Upvote 0
Mọi người gỡ rối giúp code này với. Mình viết code VBA chèn công thức vào vùng từ G3:G66 với dữ liệu được chọn từ F3:F66
Nhưng khi chạy code nó copy công thức cho hết nguyên cột G. Giờ muốn nó chạy tới G66 thôi thì sao vậy các bác
Mã:
    With ShTrangChu.Range("g3:g66" & [f66].End(3).Row)
        .Value = "=IF(RC[-1]=0,0,HLOOKUP(R2C2,Data!R2C3:R180C250,MATCH(RC[-1],Data!R2C2:R198C2,0),0))"
        .Value = "'" & .Value
    End With
 
Upvote 0
Mọi người gỡ rối giúp code này với. Mình viết code VBA chèn công thức vào vùng từ G3:G66 với dữ liệu được chọn từ F3:F66
Nhưng khi chạy code nó copy công thức cho hết nguyên cột G. Giờ muốn nó chạy tới G66 thôi thì sao vậy các bác
Mã:
    With ShTrangChu.Range("g3:g66" & [f66].End(3).Row)
        .Value = "=IF(RC[-1]=0,0,HLOOKUP(R2C2,Data!R2C3:R180C250,MATCH(RC[-1],Data!R2C2:R198C2,0),0))"
        .Value = "'" & .Value
    End With
Xem lại cái này là cái gì
Mã:
 With ShTrangChu.Range("g3:g66" & [f66].End(3).Row)
thành
Mã:
 With ShTrangChu.Range("g3:g"& [f65000].End(3).Row)
 
Upvote 0
Xem lại cái này là cái gì
Mã:
 With ShTrangChu.Range("g3:g66" & [f66].End(3).Row)
thành
Mã:
 With ShTrangChu.Range("g3:g"& [f65000].End(3).Row)
Ban đầu code là như bạn sửa á, mình muốn chèn hàm JointText vào cell G67 để nó joint các text nằm ở các ô khác, nhưng khi chạy thì nó copy công thức xuống toàn bộ các cell trong cột G. Nên mình sửa lại thành như code mình đăng lên.
Hàm Jointext viết trong VBA sẽ báo lỗi khi viết công thức có chứa ký tự đặt biệt:
Mình viết
Mã:
With ShTrangChu.range (G67)
          .value = "Jointext (",", G8, G13:G23)"
          .value = .value
End with
Nhưng không đưa ra cell được do VBA báo lỗi chỗ ","
Nên mình chèn ngoài worksheet. Nhưng bị cái code trên chèn công thức vô nguyên cột.
 
Upvote 0
Hàm Jointext viết trong VBA sẽ báo lỗi khi viết công thức có chứa ký tự đặt biệt:
Mình viết
Mã:
With ShTrangChu.range (G67)
          .value = "Jointext (",", G8, G13:G23)"
          .value = .value
End with
Nhưng không đưa ra cell được do VBA báo lỗi chỗ ","
Nên mình chèn ngoài worksheet. Nhưng bị cái code trên chèn công thức vô nguyên cột.
Chỗ nào là text được đặt trong cặp nháy đôi thì khi đưa vào VBA phải sửa 1 dấu nháy đôi thành 2 dấu
Mã:
.value = "=Jointext("","",G8,G13:G23)"
 
Lần chỉnh sửa cuối:
Upvote 0
Em chào cả nhà
Em đang code VBA để tự động hóa công việc ghép hàng vào xe (điều phối vận chuyển)
Đề bài:
- Có tổng 500 điểm phải giao hàng, khối lượng mỗi điểm giao dao động từ 0,01 tấn đến 5 tấn, tổng khối lượng phải giao là 75 tấn
+ Thứ tự địa chỉ giao đã được sắp xếp từ trên xuống dưới -> không quan tâm đến khoảng cách
+ Tồn tại 1 số điểm có lối vào nhỏ hẹp, chỉ có thể đi xe có tải trọng nhỏ nhất (0,6 tấn)
- Có 15 xe 6 tạ và 10 xe 1 tấn , tổng trọng tải là 19 tấn
+Các xe chạy chuyến 1 thì Xếp từ 1 đến 7 điểm giao hàng
+Các xe chuyến 2,3 xếp từ 5 đến 25 điểm giao hàng
Yêu cầu: Xếp mỗi xe 3 chuyến sao cho khối lượng vận chuyển/1 chuyến phải >70% trọng tải xe và ≤ 100% trọng tải xe (ưu tiên chở tối đa tải trọng)
Cách làm tay trong thực tế:
  1. Ưu tiên chuyến 1 chở hết các điểm giao có khối lượng vận chuyển lớn hơn tải trọng max của xe (phải dùng từ 2 xe trở lên mới giao hết hàng)
  2. Ghép thêm hàng cho các xe thiếu tải (ví dụ tồn tại 1 điểm giao 1,3 tấn; đã dùng 1 xe 1 tấn và 1 xe 0,6 tấn -> Xe 0,3 tấn chưa đủ tải)
  3. Dùng xe nhỏ 0,6 tấn ghép hết các điểm có lối vào nhỏ hẹp, chỉ có thể đi xe có tải trọng nhỏ nhất (1 xe đi giao nhiều điểm)
  4. Ghép từ trên xuống dưới vào các xe còn lại sao cho đúng quy định tải trọng (lơn hơn 70% và nhỏ hơn bằng 100%) (1 xe đi giao nhiều điểm)
Ghép cho đến khi hoặc là hàng hết hoặc là xe hết
*Hiện em đang dùng If, vòng lặp while,..và 1 số hàm cơ bản để mô tả lại các công việc thành code, nhưng do việc dùng vòng lặp nhiều quá + số line nhiều dẫn tới excel không thể xử lý được
Ví dụ:
While WorksheetFunction.Max(Range("J3:J" & DongCuoi5)) > WorksheetFunction.Max(Sheets("DieuXe").Range("C29:C49"))
a = WorksheetFunction.Max(Range("J3:J" & DongCuoi5))
b = WorksheetFunction.Match(a, Range("J3:J" & DongCuoi5, 0))
c = WorksheetFunction.Max(Sheets("DieuXe").Range("C29:C49"))
d = WorksheetFunction.Match(c, Sheets("DieuXe").Range("C29:C49"), 0)
While Cells(b + 2, 10) > WorksheetFunction.Max(Sheets("DieuXe").Range("C29:C49"))
Cells(b + 2, 10) = a - WorksheetFunction.Max(Sheets("DieuXe").Range("C29:C49"))
d = WorksheetFunction.Match(c, Sheets("DieuXe").Range("C29:C49"), 0)
e = 1
Cells(b + 2, 11 + e) = Sheets("DieuXe").Cells(28 + d, 2)
Sheets("DieuXe").Cells(28 + d, 3) = 0
Sheets("DieuXe").Cells(28 + d, 3 + e) = Cells(b + 2, 5)
e = e + 1
Wend
c = WorksheetFunction.Max(Sheets("DieuXe").Range("C29:C49"))
d = WorksheetFunction.Match(c, Sheets("DieuXe").Range("C29:C49"), 0)
Sheets("DieuXe").Cells(28 + d, 3) = c - Cells(b + 2, 10)
Cells(b + 2, 10) = 0
Cells(b + 2, 11 + e) = Sheets("DieuXe").Cells(28 + d, 2)
Sheets("DieuXe").Cells(28 + d, 4) = Cells(b + 2, 5)
While Sheets("DieuXe").Cells(28 + d, 3) > 0.05
Wend
Wend

* Mong các anh chị góp ý định hướng giúp em, với đề bài toán thực tế như trên, thì em nên code theo hướng nào ạ? Dùng ngôn ngữ gì để có thể xử lý nhanh? cần dùng những kiến thức gì để có thể làm được....
Em cảm ơn mọi người nhiều ạ
 
Upvote 0
Mong cả nhà định hướng góp ý giúp em với ạ
Định hướng giúp em nên dùng kiến thức gì để có thể làm được ạ, ngôn ngữ lập trình......gì cũng được ạ, em không sợ khó, chỉ sợ không tìm ra hướng giải quyết

Trong 4 bước thực tế làm thì em mới code được bước 1 nhưng mà không biết kết quả ra sao vì excel cứ quay quay không thấy ra kết quả
Bước 2,3,4 em mới ra ý tưởng, dùng kỹ thuật quay lui, nhưng mà lặp bước 1 đã treo excel rồi thì không thể làm các bước tiếp theo được
Hiện em cũng đang nghĩ cách cải tiến code và ý tưởng để có thể làm được, mấy khoản ghép hàng vào xe chỉ cộng thủ công cơ bản, nên máy tính hoàn toàn có thể bắt chước để ghép hàng tự động được, mấy hôm trước em có đọc 1 bài trên giaiphapexcel: Đề bài cho 1 dãy số, yêu cầu tìm những số thỏa mãn tổng của chúng gần nhất với tổng A cho trước, bài của em cũng chỉ là verson 2 của bài đó thôi (tìm các điểm giao hàng có tổng KLVC gần với trọng tải xe nhất)
Em xin phép gửi file excel ví dụ
 

File đính kèm

Upvote 0
Em có đoạn code để short 2 cột A,B ở sheet 1. Khi em qua sheet 2 và muôn sử dụng đoạn cốt này ở sheet 2 nhưng làm thế nào để ActiveWorkbook.Worksheets("Sheet1") chuyển thành ActiveWorkbook.Worksheets("Sheet2") được ạ? em cảm ơn!

Sub short()
'
' short Macro
'

'
Columns("A:B").Select
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("B1:B100") _
, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:B100")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
 

File đính kèm

Upvote 0
Em có đoạn code để short 2 cột A,B ở sheet 1. Khi em qua sheet 2 và muôn sử dụng đoạn cốt này ở sheet 2 nhưng làm thế nào để ActiveWorkbook.Worksheets("Sheet1") chuyển thành ActiveWorkbook.Worksheets("Sheet2") được ạ? em cảm ơn!

Sub short()
'
' short Macro
'

'
Columns("A:B").Select
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("B1:B100") _
, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:B100")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Khỏi cần ghi tên sheet hay tên workbook thì Excel sẽ hiểu đó là ActiveSheet và ActiveWorkbook
Ví dụ:
Mã:
Sub Test()
  With Range("A1:B1000")
    .Sort .Cells(1, 2), xlDescending, .Cells(1, 1), , xlDescending, , , xlNo
  End With
End Sub
Sort cột A giảm dần theo cột B tăng dần
 
Upvote 0
Khỏi cần ghi tên sheet hay tên workbook thì Excel sẽ hiểu đó là ActiveSheet và ActiveWorkbook
Ví dụ:
Mã:
Sub Test()
  With Range("A1:B1000")
    .Sort .Cells(1, 2), xlDescending, .Cells(1, 1), , xlDescending, , , xlNo
  End With
End Sub
Sort cột A giảm dần theo cột B tăng dần
CẢM ƠN ANH.
 
Upvote 0
Em có sưu tầm được 1 code copy dữ liệu từ những ô bình thường sang những ô filter. Tuy nhiên em mắc phải vấn đề là :
1. Khi vùng copy cũng là vùng filter thì paste sang vùng filter kia bị lỗi.
2. Khi paste thì giá trị ở ô cuối cùng lặp lại = số hàng đã chọn. VD : em copy dữ liệu ở ô A1,A2,A3 có giá trị lần lượt là "vịt","gà"," mèo" thì khi paste nó sẽ hiện ra là vịt , gà , mèo, mèo , mèo , mèo ( tức là thêm 3 lần "mèo" nữa ).
3. Không áp dụng được copy từ file excel này qua file excel khác được, chỉ làm được nếu trong cùng 1 file ( có thể khác sheet ).
Rất mong các anh giúp đỡ em.
Sub Paste_to_Visible_Rows()

Dim Nguon As Range, Dich As Range
Dim i As Long, r As Long
Set Nguon = Application.InputBox(prompt:="Chon Vung Copy ", Type:=8)
Set Dich = Application.InputBox(prompt:="Chep Den ", Type:=8)
For i = 1 To Nguon.Rows.Count
Do Until Not Dich.Offset(r).Rows.Hidden
r = r + 1
Loop
Nguon.Rows(i).Copy Destination:=Dich.Offset(r)
r = r + 1
Next i

End Sub
 
Upvote 0
Em có chút vấn đề về lỗi out of memory khi em chạy chương trình khá nhiều code. Em đang cố gắng sửa lại code tối ưu hóa tuy nhiên chưa được tốt cho lắm. Do lần đầu viết một ứng dụng dài hơi nên xin vài "Gợi ý" của các anh chị để tối ưu hóa và giảm thiểu lỗi trên ạ. Em xin cảm ơn. (Do em viết cho công ty em nên không tiện share code).
 

File đính kèm

  • outofmemory.png
    outofmemory.png
    41 KB · Đọc: 19
Upvote 0
Đầu tiên hết thì kiểm soát hàm đệ quy.

Ngoại trừ trường hợp hàm đệ quy ra, có 3 lý do chính để một chương trình bị phình ra và "out of memory". Đây là danh sách có sự sắp xếp, cần làm theo đúng thứ tự.

1/ dùng mảng quá lớn. Sửa bằng cách reset mảng lại sau khi dùng. Với VBA thì có thêm trường hợp string bị phình, cần set lại thành "".

2/ dùng quá nhiều objects lớn. Dùng xong thì Set chúng lại thành nothing.

3/ riêng đối với Excel, mở nhiều files có màu mè mẫu mã cũng bị tốn bộ nhớ.
3.1 đối với trường hợp nhiều code, tránh màu mè mẫu mã và shapes trong file và tránh ba cái mớ dialog box màu mè.
3.2 đóng bớt các files đã dùng xong
3.3 nếu code có dùng các objects chuyên về dữ liệu như ADO thì phải coi chừng connection và recordset.
3.4 nếu làm mọi thứ mà vẫn không được thì canh cứ khoảng vài giây, cho code save file lại. Khi được save, Excel sẽ nhả những phần memory mà nó chứa trong cache.
 
Upvote 0
Đầu tiên hết thì kiểm soát hàm đệ quy.

Ngoại trừ trường hợp hàm đệ quy ra, có 3 lý do chính để một chương trình bị phình ra và "out of memory". Đây là danh sách có sự sắp xếp, cần làm theo đúng thứ tự.

1/ dùng mảng quá lớn. Sửa bằng cách reset mảng lại sau khi dùng. Với VBA thì có thêm trường hợp string bị phình, cần set lại thành "".

2/ dùng quá nhiều objects lớn. Dùng xong thì Set chúng lại thành nothing.

3/ riêng đối với Excel, mở nhiều files có màu mè mẫu mã cũng bị tốn bộ nhớ.
3.1 đối với trường hợp nhiều code, tránh màu mè mẫu mã và shapes trong file và tránh ba cái mớ dialog box màu mè.
3.2 đóng bớt các files đã dùng xong
3.3 nếu code có dùng các objects chuyên về dữ liệu như ADO thì phải coi chừng connection và recordset.
3.4 nếu làm mọi thứ mà vẫn không được thì canh cứ khoảng vài giây, cho code save file lại. Khi được save, Excel sẽ nhả những phần memory mà nó chứa trong cache.

Em cảm ơn anh đã chỉ bảo ạ. Em sẽ xem xét các hướng dẫn của anh ở trên để tinh chỉnh lại để code chạy được suôn sẻ hơn :)
 
Upvote 0
Em nhờ các bác trên này viết được 1 đoạn code để sửa tên sheet từ thông tin 1 ô trong sheet đó.
Đoạn mã code:
Private Sub Worksheet_Deactivate()
On Error GoTo ext
Me.Name = [b1]
ext:
End Sub

Em muốn thêm nhu cầu nữa là chuyển tên sheet từ có dấu thành không dấu.
Nhờ các bác giúp đỡ.
Em cảm ơn mọi người trước!
 
Upvote 0
Em nhờ các bác trên này viết được 1 đoạn code để sửa tên sheet từ thông tin 1 ô trong sheet đó.
Đoạn mã code:
Private Sub Worksheet_Deactivate()
On Error GoTo ext
Me.Name = [b1]
ext:
End Sub

Em muốn thêm nhu cầu nữa là chuyển tên sheet từ có dấu thành không dấu.
Nhờ các bác giúp đỡ.
Em cảm ơn mọi người trước!
Bạn thêm code sau vào Module.
Mã:
Function ConvertToUnSign(ByVal sContent As String) As String
     Dim i As Long
     Dim intCode As Long
     Dim sChar As String
     Dim sConvert As String
     ConvertToUnSign = AscW(sContent)
     For i = 1 To Len(sContent)
        sChar = Mid(sContent, i, 1)
        If sChar <> "" Then
            intCode = AscW(sChar)
        End If
        Select Case intCode
            Case 273
                sConvert = sConvert & "d"
            Case 272
                sConvert = sConvert & "D"
            Case 224, 225, 226, 227, 259, 7841, 7843, 7845, 7847, 7849, 7851, 7853, 7855, 7857, 7859, 7861, 7863
                sConvert = sConvert & "a"
            Case 192, 193, 194, 195, 258, 7840, 7842, 7844, 7846, 7848, 7850, 7852, 7854, 7856, 7858, 7860, 7862
                sConvert = sConvert & "A"
            Case 232, 233, 234, 7865, 7867, 7869, 7871, 7873, 7875, 7877, 7879
                sConvert = sConvert & "e"
            Case 200, 201, 202, 7864, 7866, 7868, 7870, 7872, 7874, 7876, 7878
                sConvert = sConvert & "E"
            Case 236, 237, 297, 7881, 7883
                sConvert = sConvert & "i"
            Case 204, 205, 296, 7880, 7882
                sConvert = sConvert & "I"
            Case 242, 243, 244, 245, 417, 7885, 7887, 7889, 7891, 7893, 7895, 7897, 7899, 7901, 7903, 7905, 7907
                sConvert = sConvert & "o"
            Case 210, 211, 212, 213, 416, 7884, 7886, 7888, 7890, 7892, 7894, 7896, 7898, 7900, 7902, 7904, 7906
                sConvert = sConvert & "O"
            Case 249, 250, 361, 432, 7909, 7911, 7913, 7915, 7917, 7919, 7921
                sConvert = sConvert & "u"
            Case 217, 218, 360, 431, 7908, 7910, 7912, 7914, 7916, 7918, 7920
                sConvert = sConvert & "U"
            Case 253, 7923, 7925, 7927, 7929
                sConvert = sConvert & "y"
            Case 221, 7922, 7924, 7926, 7928
                sConvert = sConvert & "Y"
            Case Else
                sConvert = sConvert & sChar
        End Select
     Next
     ConvertToUnSign = sConvert
  End Function
Sau đó tiếp tục sửa code của bạn như sau:
Mã:
Private Sub Worksheet_Deactivate()
On Error GoTo ext
Me.Name = ConvertToUnSign([b1].Text)
ext:
End Sub
 
Upvote 0
Đầu tiên hết thì kiểm soát hàm đệ quy.

Ngoại trừ trường hợp hàm đệ quy ra, có 3 lý do chính để một chương trình bị phình ra và "out of memory". Đây là danh sách có sự sắp xếp, cần làm theo đúng thứ tự.

1/ dùng mảng quá lớn. Sửa bằng cách reset mảng lại sau khi dùng. Với VBA thì có thêm trường hợp string bị phình, cần set lại thành "".

2/ dùng quá nhiều objects lớn. Dùng xong thì Set chúng lại thành nothing.

3/ riêng đối với Excel, mở nhiều files có màu mè mẫu mã cũng bị tốn bộ nhớ.
3.1 đối với trường hợp nhiều code, tránh màu mè mẫu mã và shapes trong file và tránh ba cái mớ dialog box màu mè.
3.2 đóng bớt các files đã dùng xong
3.3 nếu code có dùng các objects chuyên về dữ liệu như ADO thì phải coi chừng connection và recordset.
3.4 nếu làm mọi thứ mà vẫn không được thì canh cứ khoảng vài giây, cho code save file lại. Khi được save, Excel sẽ nhả những phần memory mà nó chứa trong cache.
#1/ Hiện tại em không dùng Array nhiều, chỉ dùng Đệ quy nhiều. Vấn đề phình String em chưa nghiên cứu nhưng em sẽ thử set lại "" (Em có đọc đâu đó nên set vbNullString tốt hơn)

#2/ Đúng là để code trực quan hơn em có dùng một số Object Workbook, Worksheet, Mail Object. Nhưng những cái nào ít dùng em đang cố gắng dùng dạng trực tiếp. Riêng việc Set = Nothing em đang sử dụng nhưng cũng chưa rõ khi set về Nothing thì bộ nhớ đã được clear hay chưa.

#3/ Phần màu mè không có nhiều vì em chỉ load data chứ không dùng condition formatting.
#3.1 Shapes, Dialog thì cũng không có (có một số megbox thông báo thôi)

#3.2 Em đóng file APP nhưng nó không tắt hẳn.
#3.3 Em chưa học ADO nên không có dùng
#3.4 Em sẽ thử dùng cách này của anh.


Em có một vấn đề thế này, không biết anh có thể cho em lời khuyên không ạ.
Vấn đề 1: Không tắt hẳn file, dẫn tới lỗi out of memory.
Em có 2 file, file APP.xlsm và file DATA.xlsm. Em dùng file APP để đăng nhập và gọi xác nhận dữ liệu từ file DATA. Sau khi kiểm tra đăng nhập hợp lệ, sẽ nạp dữ liệu login và load dữ liệu theo user login lên trong sheet TIMESHEET của file DATA.xlsm.
Vấn đề ở chỗ mỗi file em đều có một Module dùng để quản lý biến như bên dưới. Và khi login xong, em đóng cái file APP lại, nhưng nó không tắt hẳn trong cửa sổ VBA, thành ra, những biến nó đã khai báo vẫn còn tốn bộ nhớ (em đang nghĩ vậy). Và file DATA, APP có kha khá biến tương đồng :(
Hiện tại nếu chạy file APP gọi file DATA thì bị lỗi "Out of Memory" nhưng nếu chạy trực tiếp file DATA thì không bị vấn đề trên.

Vấn đề 2:
File của em có khá nhiều biến, vì để cho code trở nên dễ đọc, và có khá nhiều Sub nên các biến được sử dụng khá nhiều, thành ra em đang tạm quản lý ở một Module dạng Public. Điều này khiến em lo lắng vì sẽ tốn khá nhiều bộ nhớ lưu trữ.

Mã:
Option Explicit
Public wb As Workbook
Public wb_App As Workbook

Public ws As Worksheet
Public ws_Login As Worksheet, ws_MemData As Worksheet, ws_TimeSheet As Worksheet
Public ws_Record As Worksheet, ws_OffData As Worksheet, ws_Confirm As Worksheet, ws_DateTime As Worksheet, ws_Manager As Worksheet

Public rng As Range
'Declare ranges in the APP file
Public btn_InfoLogin As Range, btn_Contact As Range, btn_BackInfo As Range, btn_ForgetPW As Range, btn_Login As Range, btn_AppInfo As Range, frm_UserID As Range, frm_UserPW As Range
'Declare ranges in the DATA file
Public rng_UserID As Range, rng_UserName As Range, rng_PubKey As Range, rng_Manager As Range, rng_DataTittle As Range
Public rng_EnDays As Range, rng_EnHours As Range, rng_EnMins As Range
Public rng_OutDays As Range, rng_OutHours As Range, rng_OutMins As Range
Public rng_FromDate As Range, rng_ToDate As Range, rng_FromTime As Range, rng_ToTime As Range, rng_Notes As Range

'Declare object
Public OutApp As Object, OutMail As Object

Public icnt As Long, jcnt As Long, lng_lastRow As Long

'Public int_UsedDays As Integer, int_UsedHours As Integer, int_UsedMins As Integer
'Public int_EnDOff As Integer, int_EnHOff As Integer, int_EnNOff As Integer, int_AsEnNOff As Integer

Public Cancel As Boolean

Public Const strPATH As String = "\\A\B\"
Public Const strDATA As String = "offworkDATA.xlsm"
Public Const strAPP As String = "offworkAPP.xlsm"
Public Const strPubPW As String = "XYZ"
Public answer As String
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có nhiều vấn đề quá. Khong thể giải quyết tất cả cùng 1 lúc. Làm tham lam tức là tự phình -> tự mình bị "out of memory"
Trước mắt cứ lo vấn đề #1. Mấy cái khác tính sau.
a/ hàm đệ quy rất khó debug. Bạn có thể tìm hiểu cách kiểm soát xem nó được gọi bao nhiêu lần.
b/ string thì xem lại những chỗ lập string bằng biểu thức kiểu s = s & abc, và kiểm soát độ lớn của nó.
ví dụ:
If (Len(s) Mod 1000 = 0) Then MsgBox "Đã phình ra thêm 1000 ký tự: " & Len(s)
 
Upvote 0
Bạn có nhiều vấn đề quá. Khong thể giải quyết tất cả cùng 1 lúc. Làm tham lam tức là tự phình -> tự mình bị "out of memory"
Trước mắt cứ lo vấn đề #1. Mấy cái khác tính sau.
a/ hàm đệ quy rất khó debug. Bạn có thể tìm hiểu cách kiểm soát xem nó được gọi bao nhiêu lần.
b/ string thì xem lại những chỗ lập string bằng biểu thức kiểu s = s & abc, và kiểm soát độ lớn của nó.
ví dụ:
If (Len(s) Mod 1000 = 0) Then MsgBox "Đã phình ra thêm 1000 ký tự: " & Len(s)
Vấn đề của em nằm ở chỗ cái file APP của em không hoàn toàn được đóng trong VBE, như bình luận của anh Werner Mittrup.
https://archive.sap.com/discussions/thread/3514553
 

File đính kèm

  • errorvba.png
    errorvba.png
    66.9 KB · Đọc: 13
Upvote 0
Các anh cho em hỏi sao code trong file sao không sumifs được
Cám các anh nhiều.
 

File đính kèm

Upvote 0
Các anh cho em hỏi sao code trong file sao không sumifs được
Cám các anh nhiều.
Code bạn sai hoàn toàn thì tính tổng là sao bạn, mà tôi có thấy code bạn dùng Sumifs chổ nào đâu. Mục đích của bạn là gì có thể giải thích để anh em giúp cho.
 
Upvote 0
Code bạn sai hoàn toàn thì tính tổng là sao bạn, mà tôi có thấy code bạn dùng Sumifs chổ nào đâu. Mục đích của bạn là gì có thể giải thích để anh em giúp cho.
Cám ơn Anh nhiều
Em muốn áp dụng giống code giống link sau nhưng thêm điều kiện ở cột E
http://www.giaiphapexcel.com/dienda...f-để-giảm-dung-lượng-file.101899/#post-828952
Em gửi lại file kết quả mong muốn giống cột J.
 

File đính kèm

Upvote 0
Cám ơn Anh nhiều
Em muốn áp dụng giống code giống link sau nhưng thêm điều kiện ở cột E
http://www.giaiphapexcel.com/diendan/threads/code-thay-thế-hàm-sumif-để-giảm-dung-lượng-file.101899/#post-828952
Em gửi lại file kết quả mong muốn giống cột J.
Bạn xem lại 2 chỗ ghi chú trong code:
PHP:
Private Sub CommandButton1_Click()
Dim Dic As Object, sArr(), dArr(), I As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
sArr = Range([C8], [C8].End(xlDown)).Resize(, 6).Value2
ReDim dArr(1 To UBound(sArr, 1), 1 To 1)
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 1) & sArr(I, 3) '<-------Chỗ này---------'
    If Not Dic.Exists(Tem) Then
        Dic.Add Tem, sArr(I, 6)
    Else
        Dic.Item(Tem) = Dic.Item(Tem) + sArr(I, 6)
    End If
Next I
For I = 1 To UBound(sArr, 1)
    dArr(I, 1) = Dic.Item(sArr(I, 1) & sArr(I, 3)) '<------và chỗ này-------------'
Next I
[I8].Resize(I - 1) = dArr
Set Dic = Nothing
End Sub
 
Upvote 0
Bạn có nhiều vấn đề quá. Khong thể giải quyết tất cả cùng 1 lúc. Làm tham lam tức là tự phình -> tự mình bị "out of memory"
Trước mắt cứ lo vấn đề #1. Mấy cái khác tính sau.
a/ hàm đệ quy rất khó debug. Bạn có thể tìm hiểu cách kiểm soát xem nó được gọi bao nhiêu lần.
b/ string thì xem lại những chỗ lập string bằng biểu thức kiểu s = s & abc, và kiểm soát độ lớn của nó.
ví dụ:
If (Len(s) Mod 1000 = 0) Then MsgBox "Đã phình ra thêm 1000 ký tự: " & Len(s)
Em đã giải quyết được vấn đề của mình. Lỗi ở 1 dòng code khiến nó không hoạt động được như ý.
Do em thiết lập cái Application.EnableEvents = False đầu tiên và Application.EnableEvents =True tận cuối tất cả code nên đã gây lỗi. Giờ em bỏ cả hai luôn chạy như ý rồi. Dù sao thì em cũng cảm ơn anh nhiều vì đã giúp em mở rộng kiến thức và cho em lời khuyên khi gặp vấn đề :)
 
Upvote 0
Tại sheet HD em muốn xóa các cell và khối cell : "B11:B14", "F3", "A3", "B19", "E29", "C31"
Em có viết code như sau, nhưng nó báo lỗi, nhờ các anh/chị giúp đỡ
PHP:
Sub XoaSoLieu()
    Sheets("HD").Select
    Range("B11:B14", "F3", "A3", "B19", "E29", "C31").Select
    Selection.ClearContents
    Range("F1").Select
End Sub
Em cảm ơn
 
Upvote 0
Tại sheet HD em muốn xóa các cell và khối cell : "B11:B14", "F3", "A3", "B19", "E29", "C31"
Em có viết code như sau, nhưng nó báo lỗi, nhờ các anh/chị giúp đỡ
PHP:
Sub XoaSoLieu()
    Sheets("HD").Select
    Range("B11:B14", "F3", "A3", "B19", "E29", "C31").Select
    Selection.ClearContents
    Range("F1").Select
End Sub
Em cảm ơn
Dòng này:
Range("B11:B14", "F3", "A3", "B19", "E29", "C31")
Thử bỏ các dấu nháy kép giữa chỉ chừa lại 2 dấu đầu và cuối thôi.
 
Upvote 0
Em có file tính dùng VBA dùng được rồi, bài toán em đặt ra là cần tách file dữ liệu (data) thành 1 file riêng. Nhưng em không rõ phải sửa code VBA như thế nào.
Các bác hỗ trợ em với.
File đính kèm có 2 sheet thì em cần tách sheet "Data_cable" thành file riêng tên là e-data.xls
 

File đính kèm

Upvote 0
Em có file tính dùng VBA dùng được rồi, bài toán em đặt ra là cần tách file dữ liệu (data) thành 1 file riêng. Nhưng em không rõ phải sửa code VBA như thế nào.
Các bác hỗ trợ em với.
File đính kèm có 2 sheet thì em cần tách sheet "Data_cable" thành file riêng tên là e-data.xls
Trong ổ D, tạo 1 Folder mới với tên là DIEN_2018.
Tại sheet Cable cho nó một Shapes rồi gán code sau vào thử xem:
Lưu ý: Tại K4 của sheet Data_Cable bạn gõ tên File cần lưu.

Mã:
Sub ThuXuatFile_Moi()
    Dim Path As String
    Dim filename As String
    Dim FileMoi
 
    Path = "D:\DIEN_2018\"
    filename = Sheet1.Range("K4") 'gõ tên File càn luu vào K4
    Set FileMoi = Workbooks.Add
    Sheet1.Copy Before:=FileMoi.Sheets(1)
 
    ActiveWorkbook.SaveAs filename:=Path & filename & ".xls", FileFormat:=xlNormal
    ActiveWindow.Close

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Trong ổ D, tạo 1 Folder mới với tên là DIEN_2018.
Tại sheet Cable cho nó một Shapes rồi gán code sau vào thử xem:
Lưu ý: Tại K4 của sheet Data_Cable bạn gõ tên File cần lưu.

Mã:
Sub ThuXuatFile_Moi()
    Dim Path As String
    Dim filename As String
    Dim FileMoi
 
    Path = "D:\DIEN_2018\"
    filename = Sheet1.Range("K4") 'gõ tên File càn luu vào K4
    Set FileMoi = Workbooks.Add
    'ThisWorkbook.Sheets("Data_Cable").Copy Before:=FileMoi.Sheets(1)
    Sheet1.Copy Before:=FileMoi.Sheets(1)
 
    ActiveWorkbook.SaveAs filename:=Path & filename & ".xls", FileFormat:=xlNormal
    ActiveWindow.Close
       Sheet2.Range("J4").Select
    Set FileMoi = Nothing
End Sub
em cần 2 file đặt chung 1 folder, và không cố định đường dẫn (như bác đang là D:\Dien2018...) để có thể linh hoạt hơn trong sử dụng (share cho người khác, đặt trong folder dự án khác nhau...)
bác xem có thể sửa lại giúp em được không?
 
Upvote 0
em cần 2 file đặt chung 1 folder, và không cố định đường dẫn (như bác đang là D:\Dien2018...) để có thể linh hoạt hơn trong sử dụng (share cho người khác, đặt trong folder dự án khác nhau...)
bác xem có thể sửa lại giúp em được không?
Tại K4 của sheet Data_Cable bạn gõ tên File cần lưu, khi lưu thì nó hiện hộp thoại bạn muốn lưu chỗ nào là tùy bạn.

Mã:
Sub Luu_TuyChon()
    Dim TenFile As String
    Dim FileMoi As Object
    TenFile = Sheet1.Range("K4")
    Set FileMoi = Workbooks.Add
    Sheet1.Copy Before:=FileMoi.Sheets(1)
    Application.Dialogs(xlDialogSaveAs).Show TenFile
    ActiveWindow.Close
End Sub
 
Upvote 0
Tại K4 của sheet Data_Cable bạn gõ tên File cần lưu, khi lưu thì nó hiện hộp thoại bạn muốn lưu chỗ nào là tùy bạn.

Mã:
Sub Luu_TuyChon()
    Dim TenFile As String
    Dim FileMoi As Object
    TenFile = Sheet1.Range("K4")
    Set FileMoi = Workbooks.Add
    Sheet1.Copy Before:=FileMoi.Sheets(1)
    Application.Dialogs(xlDialogSaveAs).Show TenFile
    ActiveWindow.Close
End Sub

Em hỏi thêm chút nữa,

Nếu đã tách 2 file riêng cùng folder(1 là bảng tra, 1 là data riêng tên e-data.xls). VBA nằm ở file bảng tra thì sửa code này như thế nào để nó lấy dữ liệu để tra trong file data kia.

Mã:
ThisWorkbook.Worksheets("Data_Cable")
 
Upvote 0
Em hỏi thêm chút nữa,

Nếu đã tách 2 file riêng cùng folder(1 là bảng tra, 1 là data riêng tên e-data.xls). VBA nằm ở file bảng tra thì sửa code này như thế nào để nó lấy dữ liệu để tra trong file data kia.

Mã:
ThisWorkbook.Worksheets("Data_Cable")
Trong code trên:
- Tôi dùng Sheet1 (gọi là CodeName).
- Tôi dùng Data_Cable (gọi là Sheet Name hay Tab Sheet)

2 dòng code này sử dụng cái nào cũng được, nhưng phải gõ dấu nháy phía trước nó để bỏ đi 1 dòng code (nó hiện màu xanh), như hình.
Mã:
'ThisWorkbook.Sheets("Data_Cable").Copy Before:=FileMoi.Sheets(1)

    Sheet1.Copy Before:=FileMoi.Sheets(1)

A_LuuSheet.JPG
 
Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

Upvote 0
hi bác @be09

Em có mò sửa lại code file trên để tách rời 2 file: bảng tính - data.
Nhưng gặp vấn đề ở đây là file data file luôn mở khi chạy bảng tính.
Em có đọc bài này http://www.giaiphapexcel.com/vbb/sh...-liệu-từ-1-file-đang-đóng&p=260991#post260991
Nhưng không rõ áp dụng trong trường hợp của em thì nên sử dụng như thế nào?
Bác có thể hướng 1 chút giúp em được không?
Vấn đề không đơn giản như đã trình bầy ở chủ đề này - vài dòng code tách sheet sang tập tin mới..
1. Với code hiện có thì bạn tách được sheet Data_cable sang tập tin mới e-data.xls. Nhưng sheet Data_Cable vẫn tồn tại trên tập tin cũ và code hàm DK vẫn lấy giá trị từ sheet Data_Cable của tập tin cũ. Vậy tạo thêm e-data.xls để làm cảnh?
2. Bạn có thể sửa code của DK để lấy dữ liệu từ sheet Data_Cable của tập tin e-data.xls, thậm chí là lấy từ tập tin đóng, nhưng nếu vẫn để lại sheet Data_Cable trong tập tin cũ thì tách thêm nó ra tập tin mới e-data.xls để làm gì?
3. Nếu bạn đã tách Data_Cable sang tập tin e-data.xls và bỏ Data_Cable trong tập tin cũ thì bạn sẽ có thực trạng như ở tập tin Ladder size calculation vă.xls. Tức các danh sách thả trong cột E mất tác dụng. Bạn không chọn được gì khác. Nguyên nhân là các Name mà bạn có (Formulas -> Name Manager) bị lỗi hết do tham chiếu tới sheet Data_Cable mà bạn đã xóa.
4. Có thể viết code làm: tách Data_Cable sang e-data.xls -> sửa DK để lấy dữ liệu từ e-data.xls -> xóa Data_Cable trong tập tin cũ -> sửa name để tham chiếu sang e-data.xls. Nhưng lúc đó để có thể dùng danh sách thả trong cột E thì vẫn phải mở tập tin e-data.xls. Nếu tập tin đóng thì danh sách mất tác dụng, không chọn được gì mới. Nếu chấp nhận luôn luôn mở tập tin e-data.xls khi làm việc với tập tin cũ thì tại sao phải sửa thành code lấy dữ liệu từ tập tin đóng?

Tôi chỉ lưu ý để ý thức cho bạn cái mà bạn vẫn chưa nhìn thấy. Tôi không tham gia viết code.
 
Lần chỉnh sửa cuối:
Upvote 0
Vấn đề không đơn giản như đã trình bầy ở chủ đề này - vài dòng code tách sheet sang tập tin mới..
...
Tôi chỉ lưu ý để ý thức cho bạn cái mà bạn vẫn chưa nhìn thấy. Tôi không tham gia viết code.

Tks bác đã góp ý. Chúc bác năm mới an khang, thịnh vượng!
Mục đích chính của việc tách riêng Data là để gửi bảng tính cho người khác (khi họ yêu cầu file excel). Tách riêng data thì họ sẽ chỉ xem file tính mà không thể chỉnh sửa (giữ bản quyền bảng tính của em). Thực ra nếu không cần viết VBA thì tham chiếu (reference) nó dễ dàng hơn, nhưng em thấy là nếu viết bằng công thức-hàm của excel khá phức tạp, sau cần sửa đổi gì đó mất công dò lại.

Có thể viết code làm: tách Data_Cable sang e-data.xls -> sửa DK để lấy dữ liệu từ e-data.xls -> xóa Data_Cable trong tập tin cũ -> sửa name để tham chiếu sang e-data.xls. Nhưng lúc đó để có thể dùng danh sách thả trong cột E thì vẫn phải mở tập tin e-data.xls. Nếu tập tin đóng thì danh sách mất tác dụng, không chọn được gì mới. Nếu chấp nhận luôn luôn mở tập tin e-data.xls khi làm việc với tập tin cũ thì tại sao phải sửa thành code lấy dữ liệu từ tập tin đóng?[
Bác nhắc em mới để ý đến, để em sửa lại phần Name. Nếu phương án sửa tham chiếu về tập tin đóng chạy được thì em sẽ chuyển phần Name (phục vụ cho Data Validation) về chung file bảng tính chọn, file Data chỉ để thông số của dây cáp. Em cũng muốn bảng tính nó hoàn thiện dần, tốt hơn. Em cũng không kinh nghiệm nhiều về code (thời sinh viên em cũng mày mò 1 ít Matlab) nên mong các bác chỉ bảo thêm.
 
Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom