Chuyên mục xử lý, gỡ rối code VBA

Liên hệ QC
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,930
mình đã mở khóa toàn bộ các sheet + Project VBA (mà sao chỉ thấy toàn là code tại module của sheet **~**)
file của bạn đây: https://www.mediafire.com/?ln09419fa1gk222
Trước hết em cảm ơn bác nhiều nha. }}}}}
file này của em như tiêu đề của nó tức là nhật kí của từng ngày, vì thế em viết code cho 1 sheet rồi move and copi thành 31 sheet. Mặt khác trong file có các sheet ko chứa code lên em ko dùng Macro cho toàn bộ file trong sheet được.
Bác có thể hướng dẫn em cách bác unclok file trên được ko? em ko phải người nhập dữ liệu lên em sợ file của em lại bị như thế nhiều lần nữa lại phải mang làm phiền bác thì ngại lắm. |||||
 
Upvote 0
Trước hết em cảm ơn bác nhiều nha. }}}}}
file này của em như tiêu đề của nó tức là nhật kí của từng ngày, vì thế em viết code cho 1 sheet rồi move and copi thành 31 sheet. Mặt khác trong file có các sheet ko chứa code lên em ko dùng Macro cho toàn bộ file trong sheet được.
Nếu các sheet đó có cấu trúc giống nhau --> bạn có thể gộp chung bằng cách dùng sự kiện Workbook_SheetChange tại Module ThisWorkbook thay vì cài ở từng sheet như thế.
Bác có thể hướng dẫn em cách bác unclok file trên được ko? em ko phải người nhập dữ liệu lên em sợ file của em lại bị như thế nhiều lần nữa lại phải mang làm phiền bác thì ngại lắm. |||||
- mình có search trên diễn đàn GPE (vài trang đầu) về cách mở "Project is Unviewable" nhưng ko thấy và đã tìm trên Google thì có giải thích chi tiết tại đây "Project is Unviewable" - Excel add-in (#4) (www.mrexcel.com). Riêng bài đó mình chỉ góp ý với bạn, bước 5 --> phải dùng 1 "công cụ khác" để kiểm tra pass của VBA-Project (trên GPE ko được phép share, bạn có thể nhắn tin riêng cho mình **~**)
- khi bảo vệ 1 file Excel để tránh người bình thường đụng vào Code thì bạn chỉ cần đặt pass cho VBA-Project là đủ (ko cần gì phải "khóa kỹ" như vậy)
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu các sheet đó có cấu trúc giống nhau --> bạn có thể gộp chung bằng cách dùng sự kiện Workbook_SheetChange tại Module ThisWorkbook thay vì cài ở từng sheet như thế.

- mình có search trên diễn đàn GPE (vài trang đầu) về cách mở "Project is Unviewable" nhưng ko thấy và đã tìm trên Google thì có giải thích chi tiết tại đây "Project is Unviewable" - Excel add-in (#4) (www.mrexcel.com). Riêng bài đó mình chỉ góp ý với bạn, bước 5 --> phải dùng 1 "công cụ khác" để kiểm tra pass của VBA-Project (trên GPE ko được phép share, bạn có thể nhắn tin riêng cho mình **~**)
- khi bảo vệ 1 file Excel để tránh người bình thường đụng vào Code thì bạn chỉ cần đặt pass cho VBA-Project là đủ (ko cần gì phải "khóa kỹ" như vậy)
Hi, em lập pass như vậy là do bảng này dùng cho nhiều người, người biết và không biết exel đều có. mà bảng này cần dữ liệu hàng giờ. em sợ mọi người nhập sai rồi tự sửa nhưng sửa không đúng bệnh thì toàn bộ hệ thống liên quan coi như ko làm việc bác ạ.
Một lần nữa cảm ơn bác nhiều nha. còn về phần mở pass đó em nghĩ ko cần vì pas này do em đặt ra mà. ^^. --=0
 
Upvote 0
hehe,
- thấy bạn vọc tới vọc lui cái này lâu nay rồi mà vẫn "chưa nhuyễn" được --=0,
- khi làm việc với các ActiveX Controls tại sheet sẽ gặp khá nhiều hạn chế (đặc biệt là các sự kiện tại Sheet)
---> để giải quyết triệt để và phải tính đến chuyện lâu dài về sau, thay vì theo đuổi cái đó bạn chịu khó đi thêm bước nữa là làm việc trên UserForm --> rất nhiều ưu điểm.

Em củng có nghe nói về những hạn chế này, nhưng thấy anh làm hay quá, không ngờ rằng nó lại có giới hạn nhanh như vậy,em đã dùng thử trên form rồi, vẫn có khó khăn về mặt nhập dữ liệu , em phải liên tục luân phiên liên gõ nhập trên form và nhập trực tiếp trên sheet làm chậm tốc độ gõ nhập.

Em cố chỉnh sữa file List box thong min (1).rar sao cho textbox listbox đang hoạt động ở cột C chuyễn sang hoạt động ở cột B, nhưng loay hoay mãi chỉ dời được textbox qua cột B thôi, các phần còn lại em tìm không ra nói chung là làm không được, anh chuyễn giúp em nhe ? cám ơn anh nhiều.
 
Upvote 0
Em củng có nghe nói về những hạn chế này, nhưng thấy anh làm hay quá, không ngờ rằng nó lại có giới hạn nhanh như vậy,em đã dùng thử trên form rồi, vẫn có khó khăn về mặt nhập dữ liệu , em phải liên tục luân phiên liên gõ nhập trên form và nhập trực tiếp trên sheet làm chậm tốc độ gõ nhập.

Em cố chỉnh sữa file List box thong min (1).rar sao cho textbox listbox đang hoạt động ở cột C chuyễn sang hoạt động ở cột B, nhưng loay hoay mãi chỉ dời được textbox qua cột B thôi, các phần còn lại em tìm không ra nói chung là làm không được, anh chuyễn giúp em nhe ? cám ơn anh nhiều.

không thể thực hiện được, như tôi đã có bài hỏi ở bài #90
khi bạn enter, excel mặc dịnh hiểu là enter
mặc dù bạn viết code ép cho nó nhảy lại lại nhưng nó vẩn hiểu là enter (xuống hàng)
bạn hãy thử code ví dụ ở bài 86 xem
cụ thể trong bài của bạn khi bạn kết thúc ở cột F (bằng phím enter, thì nó hiểu là ở cột F, chứ ko phải là cột A nên các textbox không được kích hoạt)

tôi nghĩ bạn nên tìm đường khác để đi
dùng form chẳng hạn hay protect sheet chỉ chừa lại 3 cái cột đó để nhập liệu.v.v.v.
 
Upvote 0
Cám ơn Let'GâuGâu nhé, ý em là em muốn tạo một sheet mới có textbox-listbox ở hoạt động ở cột khác (cột B) sau khi thay đổi

Cells(ActiveCell.Row, 3).Value = ActiveSheet.ListBox1.Value
thành
Cells(ActiveCell.Row, 2).Value = ActiveSheet.ListBox1.Value

If Not Intersect(Target, Range("C9:C1000")) Is Nothing Then
thành
If Not Intersect(Target, Range("B9:B1000")) Is Nothing Then

khi chọn vào cột B, textbox có hiện ở cột B nhưng listbox vẫn ở cột C không chịu đi chung với textbox, khi chọn tên trên listbox--> enter không thấy tên nhập vào ô textbox.

Code này chưa tính tới
PHP:
If Target.Column = 3 Then
            Range("E" & Target.Row).Select
            'hoac: Target.Offset(, 2).Select
        End If
                If Target.Column = 5 Then Target.Offset(, 1).Select
        If Target.Column = 6 Then Target.Offset(1, -3).Select

tôi nghĩ bạn nên tìm đường khác để đi
dùng form chẳng hạn hay protect sheet chỉ chừa lại 3 cái cột đó để nhập liệu.v.v.v.

Anh có thể làm giúp theo như ý anh nói không vì cái này còn quá mới em chưa biết gì cã
 
Lần chỉnh sửa cuối:
Upvote 0
tôi nghĩ bạn nên tìm đường khác để đi
dùng form chẳng hạn hay protect sheet chỉ chừa lại 3 cái cột đó để nhập liệu.v.v.v.
Anh có thể làm giúp theo như ý anh nói không vì cái này còn quá mới em chưa biết gì cã
Tôi thấy bạn cứ lòng vòng hoài với các controls trong sheet, tôi thấy mệt mỏi cho bạn quá! Tôi làm cái file này trên UserForm để bạn dễ dàng nhập dữ liệu.

Tôi tạm làm trên 1 sheet (LENH GIAO HANG) để bạn trải nghiệm thử với UserForm.

1) Vào sheet đó, bấm nút lệnh SHOW FORM để form được hiện ra, mặc định form sẽ truyền tham số STT và ngày hiện hành tại đó.

2) Từ textbox Ngày, bạn Enter để đến ComboBox Tên hàng, tại đây sẽ xổ ra danh sách, bạn có thể gõ để lọc tên hàng bạn cần.

3) Tương tự với Tên Hàng, Cbb Khu vực cũng thế.

4) Bạn phải điền đầy đủ các giá trị khác vào các textbox còn lại, ngoại trừ Ghi chú (vì có thể ghi hoặc không), nếu không sẽ không Nhập Liệu được.

5) Bấm nút Nhập Liệu để hoàn tất việc nhập mới.

6) Bạn muốn xóa hay chỉnh sửa ư? Double Click vào mục nào đó trên ListBox, một thông báo sẽ hiện ra hỏi bạn sẽ làm gì.

6.1) Nếu bạn chọn xóa (bấm No) thì một thông báo khác hỏi bạn có chắn muốn xóa, nếu Yes thì cho em vào hậu viên luôn.

6.2) Nếu bạn chọn chỉnh sửa (bấm Yes) thì dữ liệu tại hàng được chọn của ListBox sẽ chuyển lên trên các TextBox và ComboBox trong Form để bạn tùy ý chỉnh sửa mục nào bạn muốn sửa.

7) Cũng như nút Nhập Liệu, nút Lưu Chỉnh Sửa sẽ cập nhật những thông tin bạn vừa chỉnh sửa trong sheet.
 

File đính kèm

  • FormNgocNghech_HTN.xls
    167.5 KB · Đọc: 49
Upvote 0
Tôi thấy bạn cứ lòng vòng hoài với các controls trong sheet, tôi thấy mệt mỏi cho bạn quá! Tôi làm cái file này trên UserForm để bạn dễ dàng nhập dữ liệu.

Tôi tạm làm trên 1 sheet (LENH GIAO HANG) để bạn trải nghiệm thử với UserForm.

Anh Trọng Nghĩa giỏi quá! Form anh làm rất hay rất đẹp, trong cứ y như đang dùng phần mềm chuyên nghiệp vậy, em cám ơn anh rất nhiều ạ.
 
Upvote 0
Nhờ giải thích giúp lỗi

Mình sử dụng đoạn code bên dưới để load dữ liệu từ file access vào file excel.
Nhưng khi chạy thì báo lỗi "User-defined type not defined"

Nhờ các bạn xem hướng dẫn mình khắc phục giúp.
Mình cảm ơn!

Mã:
Sub loaddata(DBFullName As String, TargetRange As Range)
   Dim i, J, Cco
   Dim cn As ADODB.Connection, Rs As ADODB.Recordset, intColIndex As Integer
   Set TargetRange = TargetRange.Cells(1, 1)
   Set cn = New ADODB.Connection
   cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DBFullName & ";"
   Set Rs = New ADODB.Recordset
   Dim Cd, Luc, Momen As Double
    If Chocolumnn.op1.Value = True Then
        Cco = 0
        Call Delete_All
    Else
        Cco = Dem() - 1
    End If
    With Rs
        .Open "SELECT [Column Forces].column,[Frame Assignments Summary].AnalysisSect,[Column Forces].loc,[Column Forces].story,[Column Forces].load,[Frame Assignments Summary].length,[Frame Section Properties].depth,[Frame Section Properties].widthtop,[Column Forces].p,[Column Forces].m2,[Column Forces].m3,[Column Forces].v2,[Column Forces].v3,[Control Parameters].CurrUnits FROM [Column Forces],[Frame Assignments Summary],[Frame Section Properties],[Control Parameters] WHERE [Column Forces].column = [Frame Assignments Summary].line and [Column Forces].story=[Frame Assignments Summary].story and [Frame Assignments Summary].AnalysisSect=[Frame Section Properties].SectionName", cn, , , adCmdText
        .MoveFirst
        Cells(13, 20).Value = .Fields(13).Value
        Cd = Sheets("Data").Cells(5, 18).Value
        Luc = Sheets("Data").Cells(5, 15).Value
        Momen = Sheets("Data").Cells(5, 16).Value
        i = 1
        i = i + Cco
        Range("A18").Select
        Do
            Range("A17:T17").Copy TargetRange.Offset(i, 0)
            TargetRange.Offset(i, 0).Activate
            TargetRange.Offset(i, 0).Value = i
            TargetRange.Offset(i, 1).Value = .Fields(0).Value
            TargetRange.Offset(i, 2).Value = .Fields(1).Value
            TargetRange.Offset(i, 3).Value = .Fields(2).Value
            TargetRange.Offset(i, 4).Value = .Fields(3).Value
            TargetRange.Offset(i, 5).Value = .Fields(4).Value
            TargetRange.Offset(i, 6).Value = Math.Round(Math.Abs(.Fields(6).Value) * Cd, 5)
            TargetRange.Offset(i, 7).Value = Math.Round(Math.Abs(.Fields(7).Value) * Cd, 5)
            'TargetRange.Offset(I, 8).Value = Cells(29, 11).Value
            TargetRange.Offset(i, 9).Value = Math.Round(Math.Abs(.Fields(5).Value) * Cd, 5)
            TargetRange.Offset(i, 10).Value = Math.Abs(.Fields(8).Value) * Luc
            TargetRange.Offset(i, 11).Value = Math.Abs(.Fields(9).Value) * Momen
            TargetRange.Offset(i, 12).Value = Math.Abs(.Fields(10).Value) * Momen
            TargetRange.Offset(i, 13).Value = Math.Abs(.Fields(11).Value) * Luc
            TargetRange.Offset(i, 14).Value = Math.Abs(.Fields(12).Value) * Luc
            .MoveNext
            i = i + 1
        Loop Until .EOF
            Range("A18").Select
    End With
    Rs.Close
    Set Rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub

Function Dem()
Dim jj
    Range("A17").Select
    jj = 0
    Do While Not IsEmpty(ActiveCell)
        ActiveCell.Offset(1, 0).Select
        jj = jj + 1
    Loop
    Dem = jj
    Range("A18").Select
End Function
 
Upvote 0
Bạn chưa Refernce cái mớ Microsoft ActiveX Data... cho nên VBA không hiểu ba cái ADODB là cái gì.
 
Upvote 0
Nhờ mọi người giải thích giùm đoạn code này ạ

Mã:
Private Sub ComboBox1_Change()
ActiveCell = ComboBox1.Column(0)
ActiveCell.Offset(0, 1) = ComboBox1.Column(1)
ActiveCell.Offset(0, 2) = ComboBox1.Column(2)
End Sub
Mã:
Private Sub ComboBox1_Change()
ActiveCell = ComboBox1.Column(0)
ActiveCell.Offset(0, 1) = ComboBox1.Column(1)
ActiveCell.Offset(0, 2) = ComboBox1.Column(2)
End Sub
Sub Worksheet_Selectionchange(ByVal target As Range)
  With ComboBox1
  On Error Resume Next
    If target.Column = 3 Then
      .Visible = True
      .Top = target.Top
      .Height = target.Height
      .Left = target.Left
      .Width = target.Width
      .LinkedCell = target
    ElseIf Application.CutCopyMode = False Then
        .Visible = False
    End If
  End With
End Sub
Ở trong file này ạ, Em cảm ơn!!
 

File đính kèm

  • GPE.xls
    37 KB · Đọc: 12
Lần chỉnh sửa cuối:
Upvote 0
Giải thích code

Thông thường em gặp đoạn code có dạng này nhưng không hiểu sâu về nó. Nhờ các bác hướng dẫn dùm. Cảm ơn.
Sub DuyetTB()
Dim i As Long
With TD
For i = 1 To 5
Cells(10, i) = .Controls("TB" & i).Value
Next i
End With
End Sub
Mình hiểu là người dùng code For next
1. With TD. Hỏi TD là gì có thể thay TD bằng chữ khác được chứ (GP) chẳng hạn?
2. For i từ 1 đến 5 vậy có phải i=15 không?
3. Cells(10, i) = .Controls("TB" & i).ValueDòng này mình không hiểu về nó.
Mong các bác trợ giúp cảm ơn.
 
Upvote 0
Thông thường em gặp đoạn code có dạng này nhưng không hiểu sâu về nó. Nhờ các bác hướng dẫn dùm. Cảm ơn.

Mình hiểu là người dùng code For next
1. With TD. Hỏi TD là gì có thể thay TD bằng chữ khác được chứ (GP) chẳng hạn?
2. For i từ 1 đến 5 vậy có phải i=15 không?
3. Cells(10, i) = .Controls("TB" & i).ValueDòng này mình không hiểu về nó.
Mong các bác trợ giúp cảm ơn.
Đây là code của anh quanghai1969 thì phải?
+ COde này anh Hải dùng vòng lập For để đưa dữ liệu từ các Texbox vào Cell thôi mà, dùng vòng lặp cho nó gọn hơn thôi chứ có gì đâu.
Ở code này sẽ điền giá trị từ Texbox1 đến Texbox5 (TB1-->TB5) vào các ô từ cột 1 đến cột 5(Tức cột A đến cột E) ở dòng 10.
 
Upvote 0
Thông thường em gặp đoạn code có dạng này nhưng không hiểu sâu về nó. Nhờ các bác hướng dẫn dùm. Cảm ơn.

Mình hiểu là người dùng code For next
1. With TD. Hỏi TD là gì có thể thay TD bằng chữ khác được chứ (GP) chẳng hạn?
2. For i từ 1 đến 5 vậy có phải i=15 không?
3. Cells(10, i) = .Controls("TB" & i).ValueDòng này mình không hiểu về nó.
Mong các bác trợ giúp cảm ơn.
1. TD là cái tên mà khi người vẽ cái userform đã gán cho nó. Muốn thay đổi tên này thì vào properties của Form
2. For i = 1 to 5 có nghĩa là sẽ chạy 5 lần, cứ mỗi vòng thì i sẽ thay đổi là 1,2,3,4,5 và thoát
3. Chưa hiểu cơ bản thì đừng học quá sâu, sẽ cảm thấy rối và chán.

PS: Nếu có thể viết code ngoài bảng tính thì vào Form chẳng có gì khó cả. Mấy cái Form chẳng qua là dọa người không biết thôi
 
Upvote 0
1. TD là cái tên mà khi người vẽ cái userform đã gán cho nó. Muốn thay đổi tên này thì vào properties của Form
2. For i = 1 to 5 có nghĩa là sẽ chạy 5 lần, cứ mỗi vòng thì i sẽ thay đổi là 1,2,3,4,5 và thoát
3. Chưa hiểu cơ bản thì đừng học quá sâu, sẽ cảm thấy rối và chán.

PS: Nếu có thể viết code ngoài bảng tính thì vào Form chẳng có gì khó cả. Mấy cái Form chẳng qua là dọa người không biết thôi
Ai dời qua đây làm kiếm muốn chết, --=0
Cho hỏi thêm chút nhé bạn quanghai1969. VD tôi muốn cho code lập lại từ 1 đến 5 tại ô A1. Tôi có viết thử như thế này sao code chưa chạy được
Sub VD()
For i = 1 To 5
Sheet1.Range.[A1] , i = i
MsgBox i
Next
End Sub
Và tôi có thử thêm cái này thay đoạn màu đỏ thành
Sheets("sheet1").Range. ("A1"), i = i
nữa cũng chưa được. Tôi sai chổ nào bạn giải thích dùm. Cảm ơn bạn.
 
Upvote 0
Ai dời qua đây làm kiếm muốn chết, --=0
Cho hỏi thêm chút nhé bạn quanghai1969. VD tôi muốn cho code lập lại từ 1 đến 5 tại ô A1. Tôi có viết thử như thế này sao code chưa chạy được

Và tôi có thử thêm cái này thay đoạn màu đỏ thành nữa cũng chưa được. Tôi sai chổ nào bạn giải thích dùm. Cảm ơn bạn.

có phải bạn muốn a1 =1, a2=2...?
thử cái này xem sao
Sheets("sheet1").Range("A" & i) = i
hoặc
Sheet1.Range("A" & i) = i
 
Upvote 0
Ai dời qua đây làm kiếm muốn chết, --=0
Cho hỏi thêm chút nhé bạn quanghai1969. VD tôi muốn cho code lập lại từ 1 đến 5 tại ô A1. Tôi có viết thử như thế này sao code chưa chạy được

Và tôi có thử thêm cái này thay đoạn màu đỏ thành nữa cũng chưa được. Tôi sai chổ nào bạn giải thích dùm. Cảm ơn bạn.
Biết là ham học là rất tôt nhưng nên học từ từ. "Biết cầm dao thì hãy nghĩ tới thái thức ăn". Bạn nên học từ từ. tôi thấy cơ bản của bản còn kém lắm! Cứ nghiên cứu thật kĩ cái cơ bản như For ..next chẳng hạn.
Với mục đích của bạn ở trên tôi nghĩ chả đâu vào đâu cả. Nhưng cứ muốn thì viết như sau:
Sub VD()
For i = 1 To 5
Sheet1.[A1] = i
MsgBox i
Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Với mục đích của bạn ở trên tôi nghĩ chả đâu vào đâu cả.
Dẫu sao cũng cảm ơn bạn, Bạn nói gì vậy không biết thì hỏi là chuyện của người hỏi, trả lời hay không là chuyện của các bạn. Tôi mới tập mò mò. Thực ra tôi cũng có viết như thế này
Sub VD
For i= 1 to 5
cells(10, i)= i
msgbox i
next
end sub
Cho nên tôi mới thử viết cho 1 ô thử.
Quê quê với bạn, không biết có nên hỏi nữa hay không
 
Lần chỉnh sửa cuối:
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom