Hỏi đáp VBA trong chủ đề "Chập chững đến VBA"

Liên hệ QC

luongchihien

Thành viên mới
Tham gia
26/8/11
Bài viết
7
Được thích
1
Em xem đề tài và học hỏi được một tí, với yêu cầu như vậy! Trong file excel có sheet "Form" và sheet "Thong Tin KH" bây giờ em muốn nhập vào form (từ ô D4: D32, như trong file) rồi enter thì dữ liệu được nhập vào sheet "Thong Tin KH". Mong mọi người giúp đỡ
Em mò mẫn mãi mà ko ra ( em làm được cái gì là đính kèm hết trong file đó. gồm file excel và word chứa code)
Cảm ơn trước, cho những ai giúp đỡ!
 

File đính kèm

  • aa.xlsx
    35.8 KB · Đọc: 57
  • Code nhập vào Module.doc
    31.5 KB · Đọc: 70
Nếu 1 Sub có tham số truyền thì nút run không có tác dụng, liệt kê bằng Alt F8 sẽ không thấy.
 
Upvote 0
Nếu 1 Sub có tham số truyền thì nút run không có tác dụng, liệt kê bằng Alt F8 sẽ không thấy.
Em thử 1 code như anh Thắng nói...em xóa private đi thì Sub báo lỗi phần biến hay vùng chọn trong dấu ngoặc đơn sau ten Sub,
vậy trường hợp như thế mình sẽ xử lý như thế nào sư phụ chỉ giúp em với...."sẵn cho em hỏi ngoài chủ đề 1 tí là muốn hiểu để có thể viết và chỉnh sửa code chuẩn 1 chút thì trình độ phải học khóa VB ở trường đại học Khoa Tự Nhiên đủ chưa hay phải trình độ đại học tin học hay cao đẳng tin học vậy sư phụ chỉ điểm dùm để em biết đường mà học với.....Cảm ơn shư phụ và ACE diễn đản rất nhiều...."
 
Upvote 0
ACE diễn đàn cho em hỏi, em load về cái "private sub(.....) " mà bấm run hoài không thấy tên code hiện ra như các sub thường, vậy em chạy private sub bằng cách nào xin ACE chỉ giáo cho em....Xin cảm ơn thất nhiều....

Để biết nó chạy ra răng trong cửa sổ (CS) Immediate, bạn có thể xoá tạm thời cái từ 'Private' đó đi;

Trong CS nói trên ta cung cấp trước tham biến & có thể chạy nó;

Ví dụ ta có macro sau:

PHP:
Private Sub EmYeuAnh(GPE As String)
     MsgBox GPE
End Sub


Trong CS vừa nói, ta nhập GPE="GPE.COM" & nhấn {ENTER} khi con trỏ vẫn trên dòng đó;

Sau đó ta lại cho chạy macro bằng dòng lệnh khác, đó là nhập tại dòng khác trên CS này, như

EmYeuAnh(GPE) & lại nhấn {ENTER}

Để vui là chính đó nha!
 
Lần chỉnh sửa cuối:
Upvote 0
Em có làm 1 cái code lọc dữ liệu gồm 3 bước
B.1 lấy và short dữ liệu từ nhỏ đến lớn
B.2 Tô màu 3 giá trị P max, M2 max , M3 max
B.3 Xóa bỏ các dòng không tô màu.
Hiện tại nó chỉ tô màu cho 1 cột M2, ACE diển đàn giúp em sửa code cho nó tô cột P max và M3 max với
Xin cảm ơn thật nhiều.
Mã:
'Nut FilterData --> OK
Sub RowBeam()
 Dim RowCuoiBeam As Long, RowDauBeam As Long, Beam As Long
 Dim WorkOnBeam
  N = 6
  Cells(N, "B").Select
  If Selection.Value = "" Then Exit Sub 'Neu B6 trong nghia la khong co Data
  Do While Cells(N, "B") <> ""
    Cells(N, "B").Select
    If Cells(N, "B").Value = Cells(N + 1, "B").Value Then
      N = N + 1
    Else
      RowCuoiBeam = N
      If RowDauBeam = 1 Then
        RowDauBeam = 6
      End If
      Beam = Beam + 1
      'MsgBox "Beam thu: " & Beam & " La: " & Cells(RowDauBeam, "B").Value & Chr(13) & _
      "RowDauBeam = " & RowDauBeam & Chr(13) & _
      "RowCuoiBeam = " & RowCuoiBeam & Chr(13) & _
      "Goi lenh to dam"
      WorkOnBeam = M3_Bold(RowDauBeam, RowCuoiBeam)  '?co khi nao goi  Sub ma co lay gia tri 2 bien khong? Khong dung Function duoc khong?
      N = N + 1
    End If
    RowDauBeam = RowCuoiBeam + 1
  Loop
  Range("F" & RowCuoiBeam).Select
End Sub

Mã:
'Chuong trinh nay hoat dong --> OK
Function M3_Bold(RowDauBeam, RowCuoiBeam)
 Dim M3max, M3min1, Beam_All As Range, M3 As Range, Beam_Up As Range
 Dim M3min2, Beam_Dn As Range
 Dim Row_in_Beam As Long, RowM3max_In_Beam As Long, RowM3max As Long
 Dim RowM3min1_In_Beam As Long, RowM3min1 As Long, RowM3min2_In_Beam As Long
 Dim RowM3min2 As Long
 
  'Xac dinh vi tri M3max va to dam M3max
  Set Beam_All = Range(Cells(RowDauBeam, "F"), Cells(RowCuoiBeam, "F"))
  Beam_All.Select     'Minh hoa cho ro nghia (Delete)
  M3max = Beam_All(1).Value
  Row_in_Beam = 1
  For Each M3 In Beam_All
    'MsgBox M3.Value   'Minh hoa cho ro nghia (Delete)
    If M3.Value >= M3max Then
      M3max = M3.Value
      RowM3max_In_Beam = Row_in_Beam
    End If
    Row_in_Beam = Row_in_Beam + 1
  Next
  RowM3max = RowDauBeam + RowM3max_In_Beam - 1
  Cells(RowM3max, "F").Font.Bold = True
  Cells(RowM3max, "F").Font.ColorIndex = 7
  
  'Xac dinh vi tri M3min1 va to dam M3min1
  Set Beam_Up = Range(Cells(RowDauBeam, "F"), Cells(RowM3max - 1, "F"))
  Beam_Up.Select     'Minh hoa cho ro nghia (Delete)
  M3min1 = Beam_Up(1).Value
  Row_in_Beam = 1
  For Each M3 In Beam_Up
    'MsgBox M3.Value   'Minh hoa cho ro nghia (Delete)
    If M3.Value <= M3min1 Then
      M3min1 = M3.Value
      RowM3min1_In_Beam = Row_in_Beam
    End If
    Row_in_Beam = Row_in_Beam + 1
  Next
  RowM3min1 = RowDauBeam + RowM3min1_In_Beam - 1
  Cells(RowM3min1, "F").Font.Bold = True
  Cells(RowM3min1, "F").Font.ColorIndex = 7
  
  'Xac dinh vi tri M3min2 va to dam M3min2
  Set Beam_Dn = Range(Cells(RowM3max + 1, "F"), Cells(RowCuoiBeam, "F"))
  Beam_Dn.Select     'Minh hoa cho ro nghia (Delete)
  M3min2 = Beam_Dn(1).Value
  Row_in_Beam = 1
  For Each M3 In Beam_Dn
    'MsgBox M3.Value   'Minh hoa cho ro nghia (Delete)
    If M3.Value <= M3min2 Then
      M3min2 = M3.Value
      RowM3min2_In_Beam = Row_in_Beam
    End If
    Row_in_Beam = Row_in_Beam + 1
  Next
  RowM3min2 = RowM3max + RowM3min2_In_Beam
  Cells(RowM3min2, "F").Font.Bold = True
  Cells(RowM3min2, "F").Font.ColorIndex = 7
  M3_Bold = 0
End Function
 

File đính kèm

  • LOC DLIEU COT.rar
    77.3 KB · Đọc: 66
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Trong Function M3_Bold(RowDauBeam, RowCuoiBeam) có lệnh :

Set Beam_All = Range(Cells(RowDauBeam, "F"), Cells(RowCuoiBeam, "F"))
là xác định dòng đầu và dòng cuối chứa dữ liệu cho cột F
vậy em muốn chọn thêm trục G thì gom chung 1 lệnh hay phải tách làm 2 lệnh riêng vậy AC chỉ giúp em
Set Beam_All = Range(Cells(RowDauBeam, "F"-"G"), Cells(RowCuoiBeam, "F"-"G"))
Em sửa vậy được không các AC
 
Upvote 0
Trong Function M3_Bold(RowDauBeam, RowCuoiBeam) có lệnh :

Set Beam_All = Range(Cells(RowDauBeam, "F"), Cells(RowCuoiBeam, "F"))
là xác định dòng đầu và dòng cuối chứa dữ liệu cho cột F
vậy em muốn chọn thêm trục G thì gom chung 1 lệnh hay phải tách làm 2 lệnh riêng vậy AC chỉ giúp em
Set Beam_All = Range(Cells(RowDauBeam, "F"-"G"), Cells(RowCuoiBeam, "F"-"G"))
Em sửa vậy được không các AC
Bạn test thử là biết được không liền. Bạn thử với code sau:
Set Beam_All = Range("F" & RowDauBeam & ":G" & RowCuoiBeam)
 
Upvote 0
Em đã sửa code tô màu "filter data" từ 1 cột thành 3 cột, nhưng "short data" thì chưa sửa được, AC giúp em nhé...

'Delete Data not Bold da duoc chon truoc do
'Nut ShortData --> OK
Sub ShortData()
N = 6
Range(Cells(N, "E"), Cells(N, "G")).Select
'Cells(N, "E").Select'
'Cells(N, "F").Select

Do Until Selection.Value = ""
If Selection.Font.Bold Then
N = N + 1
'Cells(N, "E").Select
'Cells(N, "F").Select

Else
Rows(N).Delete 'Kiem tra lai, tai sao delete nay lai giu dc format cua cell, con entridelete bi xoa?
End If
Loop
End Sub
hinh xoa to mau.jpg
 

File đính kèm

  • EDIT LOC DLIEU COT.rar
    78.9 KB · Đọc: 24
Lần chỉnh sửa cuối:
Upvote 0
Trong một Sheet em có như sau:
1/ tại cell A2 có giá trị: 2012 (năm 2012)
2/ tại cell A5 có giá trị: T05 (tháng 05)
3/ tại cell A10 có công thức
PHP:
=DATE(A2;VALUE(RIGHT(A5;2))+1;0)
Và cell A10 được Format Cells "Ngày "dd" tháng "mm" năm "yyyy
4/Hàm này trả về kết quả Cell A10 như sau: Ngày 31 tháng 05 năm 2012

Em muốn viết code để nó trả về kết quả như mục 4 ở trên nhưng code không chạy
Mã:
Sub Macro1()
    Range("A10").Select
    Selection. formula = "=DATE(A2,VALUE(RIGHT(A5,2))+1,0)"
    Selection.NumberFormat = "Ngày ""dd"" tháng ""mm"" nam ""yyyy"
End Sub

Vui lòng chỉ giúp em
Em cảm ơn!
 
Upvote 0
Sub Macro1()
Range("A10").Select
Selection. formula = "=DATE(A2,VALUE(RIGHT(A5,2))+1,0)"
Selection.NumberFormat = "Ngày ""dd"" tháng ""mm"" nam ""yyyy"
End Sub[/code]

Hãy dùng bộ thu là được mà!

Selection.NumberFormat = """Ngày ""dd ""tháng"" mm ""nam ""yyyy"
 
Upvote 0
Arr(D, 4) = Arr(D, 4) + Rng1(I, 4):: Arr(D, 9) = Rng1(I, 5)

With Sheets("GPE")
.[A6:I10000].ClearContents

Anh chị cho em hỏi, trong đoạn code trên, dấu : và dấu . ý nghĩa như thế nào ạ. Và sao lại có 2 dấu :
 
Lần chỉnh sửa cuối:
Upvote 0
Arr(D, 4) = Arr(D, 4) + Rng1(I, 4):: Arr(D, 9) = Rng1(I, 5)

With Sheets("GPE")
.[A6:I10000].ClearContents

Anh chị cho em hỏi, trong đoạn code trên, dấu : và dấu . ý nghĩa như thế nào ạ. Và sao lại có 2 dấu :

Dấu : có thể hiểu tương tự như phím Enter cách dòng. Có thể viết hai cách là
Mã:
Arr(D, 4) = Arr(D, 4) + Rng1(I, 4)[B][COLOR=#ff0000]:[/COLOR][/B] Arr(D, 9) = Rng1(I, 5)
hoặc
Mã:
Arr(D, 4) = Arr(D, 4) + Rng1(I, 4)
Arr(D, 9) = Rng1(I, 5)

Còn với câu hỏi thứ hai
Mã:
Sheets("GPE")[B][COLOR=#ff0000].[/COLOR][/B][A6:I10000].ClearContents
Dấu . giống như để phân cách, phương thức, đối tượng hay thuộc tính đằng sau chính là thuộc về đối tượng đằng trước. Còn cách viết cú pháp With ... End With là một cách viết rút gọn.
 
Upvote 0
Cho em hỏi tiếp ạ
Dim Rng1(), Rng2(), Arr(), Arr2(), I As Long, J As Long, K As Long, N As Long

Ở dòng khai báo biến trên, tại sao các biến I, J, K, N khai báo theo cú pháp Dim....as
Còn biến Rng1(), Rng2(), Arr(), Arr2() thì không có As
 
Upvote 0
Giúp em sửa code như sau:
Nếu cell A4 của sheet1 bằng 1 thì Sheet1 không bị khóa
Ngoài ra nếu cell A4 của sheet1 khác 1 thì Sheet1 bị khóa
PW: là 123
Code của em
PHP:
Sub abc()
With Sheets("Sheet1")
If Range("A4") <> 1 Then
.Protect 123
Else
.Unprotect 123
End With
End Sub
Em cảm ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
Giúp em sửa code như sau:
Nếu cell A4 của sheet1 bằng 1 thì Sheet1 không bị khóa
Ngoài ra nếu cell A4 của sheet1 khác 1 thì Sheet1 bị khóa
PW: là 123
Code của em
PHP:
Sub abc()
With Sheets("Sheet1")
If Range("A4") <> 1 Then
.Protect 123
Else
.Unprotect 123
End With
End Sub
Em cảm ơn!
Code của bạn thiếu End If, hơn nữa code này bạn đưa vào sự kiện Private Sub Worksheet_Change() thì tiện hơn
 
Upvote 0
Giúp em sửa code như sau:
Nếu cell A4 của sheet1 bằng 1 thì Sheet1 không bị khóa
Ngoài ra nếu cell A4 của sheet1 khác 1 thì Sheet1 bị khóa
PW: là 123
Code của em
PHP:
Sub abc()
With Sheets("Sheet1")
If Range("A4") <> 1 Then
.Protect 123
Else
.Unprotect 123
End With
End Sub
Em cảm ơn!

Có thể sửa lại như sau:
PHP:
Sub abc()
On Error Resume Next
With ThisWorkbook.Sheets("Sheet1")
    If .Range("A4") <> 1 Then .Protect "123" Else .Unprotect "123"
End With
End Sub
 
Upvote 0
Giúp em sửa code như sau:
Nếu cell A4 của sheet1 bằng 1 thì Sheet1 không bị khóa
Ngoài ra nếu cell A4 của sheet1 khác 1 thì Sheet1 bị khóa
PW: là 123
Code của em
PHP:
Sub abc()
With Sheets("Sheet1")
If Range("A4") <> 1 Then
.Protect 123
Else
.Unprotect 123
End With
End Sub
Em cảm ơn!
Code của bạn bị lỗi cấu trúc do thiếu dòng End If. Thêm vào là được.
Mã:
Sub abc()
With Sheets("Sheet1")
If Range("A4") <> 1 Then
.Protect 123
Else
.Unprotect 123
[B]End If[/B]
End With
End Sub
 
Upvote 0
Em đang vọc đọan code chuyển chữ thường thành chữ HOA, như sau
Mã:
Sub LowToUp()
Dim kq(1 To 20000, 1 To 1), DL(), i
DL = [D18:D20000].Value
For i = 1 To UBound(DL)
kq(i, 1) = UCase(DL(i, 1))
Next
[D18:D20000] = kq
End Sub
Code trên chỉ chạy đúng khi Sheet hiện hành không bị đang bị AutoFilter (Nếu đang Filter thì nó chạy sai) Em muốn các Thầy cô & Anh chị giúp em chèn thêm đọan code xả Filter (Show All) trước khi chạy code này
-----------
Em có Record Macro, nhưng khi em lồng vào code này thì chỉ chạy được 1 Sheet, em muốn nó có thể thực thi ở mọi Sheet mà em chọn
Em cảm ơn!
---------------
P/S: em làm được rồi, nh MOD xóa bài giúp
 
Lần chỉnh sửa cuối:
Upvote 0
Em có thấy trên mạng đọan code như sau:
PHP:
Sub test()
Dim DataRange  As Variant
Dim Irow       As Long
Dim Icol       As Integer
Dim MyVar      As Double
DataRange = Range("A1:C10000").Value                  ' Ð?c t?t c? các giá tr? t? Excel m?t l?n, và dua vào m?ng
For Irow = 1 To 10000
    For Icol = 1 To 3
        MyVar = DataRange(Irow, Icol)
        If MyVar > 0 Then
            MyVar = MyVar * MyVar                     ' Thay d?i các giá tr? trong m?ng
            DataRange(Irow, Icol) = MyVar
        End If
    Next Icol
Next Irow
Range("A1:C10000").Value = DataRange
End Sub
đây là đọan code khi chạy sẽ nhân đôi đối với những cell lớn hơn không
Bây giờ em muốn chỉnh lại code trên với điều kiện như sau
Nếu cell A1 và B1 lớn hơn không thì C1=A1+B1, tương tự cho các cell bên dưới

Vì em đang lọ mọ học hỏi, nên các anh chị giúp em viết theo hai cách:
1/ kiểu dạng RC (dạng công thức)
2/ Kiểu mảng
mục đích để em so sánh và học. Em cảm ơn.
 
Upvote 0
/(iểu 1 đây, xin mời bạn ướm

PHP:
Option Explicit
Sub CongThúc()
 Dim Cls As Range, Rng As Range
 
 Set Rng = [A1].End(xlDown).CurrentRegion
 For Each Cls In Rng(1).Offset(, 2).Resize(Rng.Rows.Count)
    With Cls
        If .Offset(, -1).Value > 0 And .Offset(, -2).Value > 0 Then _
            .FormulaR1C1 = "=RC[-2]+RC[-1]"
    End With
 Next Cls
End Sub
 
Upvote 0
Web KT
Back
Top Bottom