Hỏi nhanh - Đáp nhanh về macro (dành cho các thành viên mới học lập trình) (2 người xem)

Liên hệ QC

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

tuananhya2

Thành viên mới
Tham gia
18/8/12
Bài viết
8
Được thích
0
Co ai chỉ dùm cách tạo pass marco với
 
Cho em hỏi có cách nào khi người dùng save file, thì sẽ tự động chạy 1 macro mình đã viết sẵn không. Tưng tự như "Sub Auto open" khi file được mở ra sẽ chạy 1 macro đã viết sẵn. Thanks
 
Upvote 0
Cho em hỏi có cách nào khi người dùng save file, thì sẽ tự động chạy 1 macro mình đã viết sẵn không. Tưng tự như "Sub Auto open" khi file được mở ra sẽ chạy 1 macro đã viết sẵn. Thanks

Đó là Sub Auto_Close bạn à ---> Sẽ tự chạy khi đóng file
 
Upvote 0
sao khi tải bài mẫu về thì không chạy macro được nhi?
p/s:chắc có lẽ vì dốt quá nên mới thế.nhưng cũng phải hỏi cho sáng cái đầu ra!
 
Upvote 0
Cho mình hỏi một vấn đề như sau :
- Mình có một mảng Arr chứa các thông tin --> bh mình muốn đưa toàn bộ dữ liệu mảng này xuống vùng [A1 :A1000] dưới dạng comment
---> có cách nào không dùng vòng lặp for để thực hiện việc trên không <---------- hôm qua mình dùng vòng for thấy tốc độ không ổn cho lắm cụ thể code mình như sau :

[GPECODE=vb]Sub AddComment(rng As Range, str As String)
With rng
.ClearComments
.AddComment str
.Comment.Shape.AutoShapeType = 1
With .Comment.Shape.TextFrame
.Characters(InStr(str, "Name :"), 6).Font.Bold = 1
.Characters.Font.Size = 9
.AutoSize = 1
End With
.Comment.Visible = 0
End With
End Sub[/GPECODE]
và đây là câu lệnh được trích ra từ sub main :
[GPECODE=vb]
For Each mycell In [A1:A1000]
AddComment mycell, Cstr(Arr(i))
Next
[/GPECODE]

Cho em hỏi là trong excel có lệnh nào mà gán 1 nhát xuống sheet hết các comment kiểu như là [A1:A1000] = Arr không ? -+*/

----> Cảm ơn mọi người đã dành thời gian đọc bài viết của mình !
 
Lần chỉnh sửa cuối:
Upvote 0
Cho mình hỏi một vấn đề như sau :
- Mình có một mảng Arr chứa các thông tin --> bh mình muốn đưa toàn bộ dữ liệu mảng này xuống vùng [A1 :A1000] dưới dạng comment
---> có cách nào không dùng vòng lặp for để thực hiện việc trên không
Cho em hỏi là trong excel có lệnh nào mà gán 1 nhát xuống sheet hết các comment kiểu như là [A1:A1000] = Arr không ? -+*/
Nếu bạn tìm được cách nào đó mà bằng tay làm được thao tác gán comment 1 lượt thì code sẽ làm được
Suy nghĩ xem!
Nếu suy nghĩ không ra nghĩa là KHÔNG CÓ CÁCH
Vậy thôi
 
Upvote 0
mình đang tập viết những ứng dụng nhỏ phục vu cho công việc nhưng găp những vướng mắc nhờ mọi người giúp đỡ, mình nói qua những cái mình đã làm
1. Lập được uerform (đã làm được)
2. Bây giờ mình muốn từ 1 cell bất kỳ của cột đã định trước cột (cột B) chỉ khi nào ấn ENTER là gọi userform lên làm việc (form này có listbox chứa sắn dữ liệu) bây giờ mình muốn là chọn xong dữ liệu thì form tắt đồng thời dữ liệu được điền vào cell vừa rồi mình ấn ENTER.
 
Upvote 0
mình đang tập viết những ứng dụng nhỏ phục vu cho công việc nhưng găp những vướng mắc nhờ mọi người giúp đỡ, mình nói qua những cái mình đã làm
1. Lập được uerform (đã làm được)
2. Bây giờ mình muốn từ 1 cell bất kỳ của cột đã định trước cột (cột B) chỉ khi nào ấn ENTER là gọi userform lên làm việc (form này có listbox chứa sắn dữ liệu) bây giờ mình muốn là chọn xong dữ liệu thì form tắt đồng thời dữ liệu được điền vào cell vừa rồi mình ấn ENTER.
Vậy thì tại cell bất kỳ của cột B tạo 1 sự kiện change để kích hoạt mở userform. Rồi trong userform tiếp tục gán sự kiện đóng form và chuyển kết quả đến cell cần đến.
 
Upvote 0
Vậy thì tại cell bất kỳ của cột B tạo 1 sự kiện change để kích hoạt mở userform. Rồi trong userform tiếp tục gán sự kiện đóng form và chuyển kết quả đến cell cần đến.
Cám ơn bạn vấn đề là ở chổ này tại ô B3 ấn ENTER sau đó lại thay kết quả vào ô B3 lúc đó sự kiện change sẽ lặp lại userform lại load lên mình thấy không ổn
mình đang vướng mắc
1. làm sao xác định sự kiện ấn ENTER
2. Trả về dòng con trỏ đang đứng để đưa thông tin vào
 
Upvote 0
Cám ơn bạn vấn đề là ở chổ này tại ô B3 ấn ENTER sau đó lại thay kết quả vào ô B3 lúc đó sự kiện change sẽ lặp lại userform lại load lên mình thấy không ổn
mình đang vướng mắc
1. làm sao xác định sự kiện ấn ENTER
2. Trả về dòng con trỏ đang đứng để đưa thông tin vào
Khi dùng sự kiện change thì phải biết sử dụng câu lệnh Application.EnableEvents=False để khống chế lỗi vòng lặp vô tận.
 
Upvote 0
Cám ơn bạn vấn đề là ở chổ này tại ô B3 ấn ENTER sau đó lại thay kết quả vào ô B3 lúc đó sự kiện change sẽ lặp lại userform lại load lên mình thấy không ổn
mình đang vướng mắc
1. làm sao xác định sự kiện ấn ENTER
2. Trả về dòng con trỏ đang đứng để đưa thông tin vào

1> Code cho Module:
Mã:
Sub EventEnable()
  Application.OnKey "~", "ShowForm"
End Sub
Sub EventDisable()
  Application.OnKey "~", ""
End Sub
Sub ShowForm()
  UserForm1.Show
End Sub
2> Code cho sự kiện SelectionChange (trên sheet)
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Address = "$B$3" Then
    EventEnable
  Else
    EventDisable
  End If
End Sub
Làm đại, chưa biết trúng không! Bạn kiểm tra xem
-------------------
Phần gán dữ liệu từ UserForm xuống, bạn tự làm nhé
 
Upvote 0
1> Code cho Module:
Mã:
Sub EventEnable()
  Application.OnKey "~", "ShowForm"
End Sub
Sub EventDisable()
  Application.OnKey "~", ""
End Sub
Sub ShowForm()
  UserForm1.Show
End Sub
2> Code cho sự kiện SelectionChange (trên sheet)
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Address = "$B$3" Then
    EventEnable
  Else
    EventDisable
  End If
End Sub
Làm đại, chưa biết trúng không! Bạn kiểm tra xem
-------------------
Phần gán dữ liệu từ UserForm xuống, bạn tự làm nhé
Cám ơn Thầy
Để mai làm tiếp có chi không biết mong thầy chỉ bảo thêm
 
Upvote 0
Khi dùng sự kiện change thì phải biết sử dụng câu lệnh Application.EnableEvents=False để khống chế lỗi vòng lặp vô tận.
làm theo cách của bạn mình đã làm được nhưng lại phát sinh lỗi khi xóa dữ liệu userform lại bị load lên
 
Lần chỉnh sửa cuối:
Upvote 0
1> Code cho Module:
Mã:
Sub EventEnable()
  Application.OnKey "~", "ShowForm"
End Sub
Sub EventDisable()
  Application.OnKey "~", ""
End Sub
Sub ShowForm()
  UserForm1.Show
End Sub
2> Code cho sự kiện SelectionChange (trên sheet)
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Address = "$B$3" Then
    EventEnable
  Else
    EventDisable
  End If
End Sub
Làm đại, chưa biết trúng không! Bạn kiểm tra xem
-------------------
Phần gán dữ liệu từ UserForm xuống, bạn tự làm nhé

Cám ơn thầy đã giúp đỡ nhưng em không biết lỗi ở đâu mà em lam theo không thấy nó chạy chi cả
thầy cho em hỏi bây giờ em muốn lấy số thứ tự của hàng mà con trỏ đang đứng làm việc
 
Upvote 0
Chào các anh chị giaiphapexcel,

em có vấn đề nhỏ cần nhờ anh chị giải quyết giúp. Anh chị xem ở file em gửi kèm, bây h em muốn khi mình chọn mã số NV xong click vào button thì số công nhân viên đó được cộng thêm 1 đúng vào dòng đó ở bên bảng dữ liệu.

giúp em với nhé!
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
thữ vậy xem được ko

Sub a()

For i = 4 To Sheet2.[a100].End(xlUp).Row
If Sheet2.Range("A" & i).Value = Sheet1.[c3] Then
Sheet1.[c6].Value = 1 + CInt(Sheet1.[c6].Value)
Sheet2.Range("c" & i).Value = Sheet1.[c6].Value
Exit For
End If
Next

End Sub
 
Upvote 0
Cảm ơn nhapmon đã giúp đỡ nhưng mà chưa được bạn ạ!

vd công của nv1 đang là 7 thì nếu chuyển sáng nv2 nó cộng luôn lên bằng 8 :) ý mình là muốn cộng thêm công cho mỗi NV riêng biệt không liên quan đến nhau, nhờ bạn giúp.
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các anh chị giaiphapexcel,

em có vấn đề nhỏ cần nhờ anh chị giải quyết giúp. Anh chị xem ở file em gửi kèm, bây h em muốn khi mình chọn mã số NV xong click vào button thì số công nhân viên đó được cộng thêm 1 đúng vào dòng đó ở bên bảng dữ liệu.

giúp em với nhé!
Xài thử Sub này cho cái Button của bạn coi sao
PHP:
Public Sub GPE()
Application.ScreenUpdating = False
Dim Rng As Range, Cll As Range, Tem As String
Tem = UCase([C3])
With Sheets("S2")
    Set Rng = .Range(.[A4], .[A65000].End(xlUp))
    For Each Cll In Rng
        If UCase(Cll) = Tem Then
            Cll.Offset(, 2).Value = Cll.Offset(, 2).Value + 1
            Exit For
        End If
    Next
End With
Set Rng = Nothing
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn nhapmon đã giúp đỡ nhưng mà chưa được bạn ạ!

vd công của nv1 đang là 7 thì nếu chuyển sáng nv2 nó cộng luôn lên bằng 8 :) ý mình là muốn cộng thêm công cho mỗi NV riêng biệt không liên quan đến nhau, nhờ bạn giúp.

Xem thử file đính kèm xem được không ?
 
Upvote 0
Cảm ơn nhapmon đã giúp đỡ nhưng mà chưa được bạn ạ!

vd công của nv1 đang là 7 thì nếu chuyển sáng nv2 nó cộng luôn lên bằng 8 :) ý mình là muốn cộng thêm công cho mỗi NV riêng biệt không liên quan đến nhau, nhờ bạn giúp.

đã có nhiêu code hay hơn, nhưng nếu có sửa thì sửa lại như vậy

Sub a()
For i = 4 To Sheet2.[a100].End(xlUp).Row
If Sheet2.Range("A" & i).Value = Sheet1.[c3] Then
Sheet2.Range("c" & i).Value = Sheet1.[c6].Value + 1
Exit For
End If
Next
End Sub
 
Upvote 0
Thật là nhiều cách để giải quyết vấn đề :D cảm ơn các bạn các anh rất nhiều :X
 
Upvote 0
Các anh chị trong GPE cho mình hỏi : làm thế nào để thay đổi tên module1 ( trong VBA ) thành tên khác được không ?
Ví dụ Module1 --> rename thành abcxyz ....?
 
Upvote 0
Khi đóng File thì muốn Excel trả về chế độ Automatic
-------------------------------------------------------
Em có 1 File Excel khi mở thì đưa về chế độ Application.Calculation = xlCalculationManual
Khi đóng file thì em muốn nó trở về chế độ Application.Calculation = xlCalculationAutomatic
Nhưng thực tế khi đóng file thì nó vẫn ở chế độ Manual
Code trong Thisworkbook
Mã:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    
    Application.Calculation = xlCalculationAutomatic
    If Chk = False Then
        Cancel = True
        
        Application.ExecuteExcel4Macro ("ALERT(""" & Evaluate("tb_2") & """,2)")
    Else
        If Workbooks.Count = 1 Then ThisWorkbook.Close
        
    End If
    Application.Caption = ""
    
End Sub
Private Sub Workbook_Open()
    Sheets("Main").Select
    
    Application.Calculation = xlCalculationManual
End Sub
Vui lòng giúp em sửa code để khi đóng file thì trả về chế độ Automatic
em cảm ơn
 

File đính kèm

Upvote 0
Khi đóng File thì muốn Excel trả về chế độ Automatic
-------------------------------------------------------
Em có 1 File Excel khi mở thì đưa về chế độ Application.Calculation = xlCalculationManual
Khi đóng file thì em muốn nó trở về chế độ Application.Calculation = xlCalculationAutomatic
Nhưng thực tế khi đóng file thì nó vẫn ở chế độ Manual
Code trong Thisworkbook
Mã:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    
    [COLOR=#ff0000]Application.Calculation = xlCalculationAutomatic[/COLOR]
    If Chk = False Then
        Cancel = True
        
        Application.ExecuteExcel4Macro ("ALERT(""" & Evaluate("tb_2") & """,2)")
    Else
        If Workbooks.Count = 1 Then ThisWorkbook.Close
        
    End If
    Application.Caption = ""
    
End Sub
Private Sub Workbook_Open()
    Sheets("Main").Select
    
    Application.Calculation = xlCalculationManual
End Sub
Vui lòng giúp em sửa code để khi đóng file thì trả về chế độ Automatic
em cảm ơn
Dòng màu đỏ bạn cho vào Sub CloseWb là được rồi
 
Upvote 0
Dòng màu đỏ bạn cho vào Sub CloseWb là được rồi
Em đã cho vào sao chưa thấy có kết qủa
Thầy xem giúp em
Mã:
Sub CloseWb()

    Dim Ans As Long
    With CreateObject("WScript.Shell")
        Ans = .Popup(Evaluate("tb_1"), , "THÔNG BÁO", vbYesNoCancel)
    End With
    If Ans <> 2 Then
        Chk = True
        ThisWorkbook.Close (Ans = 6)
       [COLOR=#0000ff][B] Application.Calculation = xlCalculationAutomatic[/B][/COLOR]
    End If
    
End Sub
 
Upvote 0
Em đã cho vào sao chưa thấy có kết qủa
Thầy xem giúp em
Mã:
Sub CloseWb()

    Dim Ans As Long
    With CreateObject("WScript.Shell")
        Ans = .Popup(Evaluate("tb_1"), , "THÔNG BÁO", vbYesNoCancel)
    End With
    If Ans <> 2 Then
        Chk = True
        ThisWorkbook.Close (Ans = 6)
       [COLOR=#0000ff][B] Application.Calculation = xlCalculationAutomatic[/B][/COLOR]
    End If
    
End Sub

Dòng màu xanh phải cho lên phía trên chứ sao lại nằm ở dưới thế
Mã:
Sub CloseWb()

    Dim Ans As Long
    With CreateObject("WScript.Shell")
        Ans = .Popup(Evaluate("tb_1"), , "THÔNG BÁO", vbYesNoCancel)
    End With
    If Ans <> 2 Then
        [COLOR=#0000ff][B] Application.Calculation = xlCalculationAutomatic[/B][/COLOR]
        Chk = True
        ThisWorkbook.Close (Ans = 6)
    End If
    
End Sub
 
Upvote 0
nhờ các anh giúp em vấn đề này:

em muốn mỗi khi mình nhấn button thì dữ liệu ở bảng sheet1 sẽ cập nhật liên tục thành dòng sang sheet 2. em cảm ơn!
 

File đính kèm

Upvote 0
nhờ các anh giúp em vấn đề này:

em muốn mỗi khi mình nhấn button thì dữ liệu ở bảng sheet1 sẽ cập nhật liên tục thành dòng sang sheet 2. em cảm ơn!

Vì đây là topic hỏi nhanh - đáp nhanh --> cũng thử đáp nhanh xem thế nào ?

Assign Macro đoạn code sau vào nút click của bạn :
[GPECODE=vb]
Sub ABC()
With Sheet2.[A65536].End(3).Offset(1)
.NumberFormat = "m/d/yyyy": .Value = [B5]
.Offset(, 1) = [B6]
.Offset(, 2).NumberFormat = "#,##0 ""d"""
.Offset(, 2) = [B9]
End With
End Sub
[/GPECODE]
 
Upvote 0
cảm ơn hungpecc1 giúp em thêm cái cột số thứ tự ở đầu nhé!
 
Upvote 0
Thực ra dùng công thức cũng được mà bạn
Mình cũng thấy bài này dùng công thức vừa gọn nhẹ, lại thông dụng ----> hay bây giờ xu thế là phải phức tạp, màu mè cho giống chuyên nghiệp nhj ?

" Hình thức quyết đinh nội dung " hay " nội dung quyết định hình thức " nhỉ ?
_)()(-_)()(-
 
Upvote 0
Xu thế Xulubu hạy Buluxu gì cũng được mà. Người ta nhờ thêm STT thì thêm STT.
Híc!
 

File đính kèm

Upvote 0
Hì mình thấy dùng macros gọn hơn và hiệu quả hơn mà ! cảm ơn mọi người!
 
Upvote 0
Chào mọi người!
cho em hỏi ở các topic trước mọi người bảo muốn hiểu về macro thì nhấn Alt+ F11 tìm hiểu. nhưng em mở ra toàn tiếng anh không à. xem ko hiểu gì hết? mọi người ai biết chỉ dùm mình với ạ?
 
Upvote 0
Chào mọi người!
cho em hỏi ở các topic trước mọi người bảo muốn hiểu về macro thì nhấn Alt+ F11 tìm hiểu. nhưng em mở ra toàn tiếng anh không à. xem ko hiểu gì hết? mọi người ai biết chỉ dùm mình với ạ?
Alt + F11 sẽ dẫn bạn vào cửa sổ VBE, là nơi để bạn code. Nó giống như là một môi trường để bạn làm việc chứ nó không có cái hướng dẫn cho bạn làm gì cụ thể cả.

Nếu bạn muốn tìm hiểu về VBA, bạn cần biết bạn phải làm gì, rồi bạn có thể mày mò thông qua sách vở, qua diễn đàn GPE, thông qua các trang web Excel khác, và thực hành tại chính VBE. Ngoài ra bạn có thể tham khảo thêm Help của Excel nữa.
 
Upvote 0
hỏi về cách sử dụng mảng:
chào mọi người tôi đang học mảng trong vba, sao thấy khó nuốt. anh chị chỉ giúp đoạn code sau

Sub Array_sao_kho_qua()

Dim l As Long, m As Long
vArr = Range("A1:B10").Value
For l = LBound(vArr, 1) To UBound(vArr, 1)
For m = LBound(vArr, 2) To UBound(vArr, 2)
If vArr(l, m) = "heo" Then
''''viet gi o day
End If
Next m
Next l

Range("C10:D20").Value = vArr

End Sub

bây giời tôi muốn, cái nào bên cột A là "heo" thì chép nó qua C10:C?
 

File đính kèm

Upvote 0
hỏi về cách sử dụng mảng:
chào mọi người tôi đang học mảng trong vba, sao thấy khó nuốt. anh chị chỉ giúp đoạn code sau

Sub Array_sao_kho_qua()

Dim l As Long, m As Long
vArr = Range("A1:B10").Value
For l = LBound(vArr, 1) To UBound(vArr, 1)
For m = LBound(vArr, 2) To UBound(vArr, 2)
If vArr(l, m) = "heo" Then
''''viet gi o day
End If
Next m
Next l

Range("C10:D20").Value = vArr

End Sub

bây giời tôi muốn, cái nào bên cột A là "heo" thì chép nó qua C10:C?

Mình thì cũng mới học VBA --> nên không đủ trình độ để nhận xét hay sửa code của bạn
Nhưng nếu để thực hiện yêu cầu như bạn thì mình sẽ viết code như sau :
[GPECODE=vb]
Sub Array_Kho_qua_sao()
Dim i As Long, n As Long
Dim Arr, tmparr
tmparr = [A1:B9].Value
ReDim Arr(1 To UBound(tmparr, 1), 1 To 2)
For i = 1 To UBound(tmparr, 1)
If tmparr(i, 1) = "heo" Then
n = n + 1
Arr(n, 1) = tmparr(i, 1)
Arr(n, 2) = tmparr(i, 2)
End If
Next
[C1].Resize(n, 2) = Arr
End Sub
[/GPECODE]
 
Upvote 0
hỏi về cách sử dụng mảng:
chào mọi người tôi đang học mảng trong vba, sao thấy khó nuốt. anh chị chỉ giúp đoạn code sau

Sub Array_sao_kho_qua()

Dim l As Long, m As Long
vArr = Range("A1:B10").Value
For l = LBound(vArr, 1) To UBound(vArr, 1)
For m = LBound(vArr, 2) To UBound(vArr, 2)
If vArr(l, m) = "heo" Then
''''viet gi o day
End If
Next m
Next l

Range("C10:D20").Value = vArr

End Sub

bây giời tôi muốn, cái nào bên cột A là "heo" thì chép nó qua C10:C?
Chắc là vầy chăng:
Mã:
Sub Array_sao_kho_qua()
  Dim tmp, arr, vArr
  Dim lR As Long, lC As Long, n As Long
  vArr = Range("A1:B10").Value
  ReDim arr(1 To UBound(vArr, 1), 1 To UBound(vArr, 2))
  For lR = LBound(vArr, 1) To UBound(vArr, 1)
    tmp = vArr(lR, 1)
    If tmp = "heo" Then
      n = n + 1
      For lC = LBound(vArr, 2) To UBound(vArr, 2)
        arr(n, lC) = vArr(lR, lC)
      Next
    End If
  Next
  If n Then Range("C1:D1").Resize(n).Value = arr
End Sub
 
Upvote 0
cám ơn 2 anh, tôi bắt đầu dzọc vba gần năm rùi, mà nón nay đúng là khó nuốt quá. hồi trước tới giờ né nó luôn...hi,...hi. bi giờ thử học coi có làm nổi ko....còn khó quà thì thui...hi..hi
tôi có đọc một số bài của tác giả lê văn việt, nhưng càng đọc càng lùng bùng
cái gì mà dim rùi lại redim, rùi mảng một chiều 2 chiều.....
thử học xem có làm được ko, có gì nhờ các anh chỉ dạy.....
cám ơn các anh nhiều.
 
Upvote 0
cám ơn 2 anh, tôi bắt đầu dzọc vba gần năm rùi, mà nón nay đúng là khó nuốt quá. hồi trước tới giờ né nó luôn...hi,...hi. bi giờ thử học coi có làm nổi ko....còn khó quà thì thui...hi..hi
tôi có đọc một số bài của tác giả lê văn việt, nhưng càng đọc càng lùng bùng
cái gì mà dim rùi lại redim, rùi mảng một chiều 2 chiều.....
thử học xem có làm được ko, có gì nhờ các anh chỉ dạy.....
cám ơn các anh nhiều.

Với mảng 2 chiều, bạn cứ tưởng tượng nó là 1 vùng trên bảng tính là được rồi (vùng nhiều dòng, nhiều cột)
Tôi nghĩ cái khó đối với bạn là vụ Dim và ReDim, đúng không? Chẳng qua chỉ là việc khai báo kích thước của mảng thôi mà (dài bao nhiêu, rộng bao nhiêu...)
 
Upvote 0
cám ơn 2 anh, tôi bắt đầu dzọc vba gần năm rùi, mà nón nay đúng là khó nuốt quá. hồi trước tới giờ né nó luôn...hi,...hi. bi giờ thử học coi có làm nổi ko....còn khó quà thì thui...hi..hi
tôi có đọc một số bài của tác giả lê văn việt, nhưng càng đọc càng lùng bùng
cái gì mà dim rùi lại redim, rùi mảng một chiều 2 chiều.....
thử học xem có làm được ko, có gì nhờ các anh chỉ dạy.....
cám ơn các anh nhiều.
Thật ra nếu học phần mảng 1 chiều và 2 chiều chỉ cần 1 ngày là hiểu. Khó nuốt là lúc mình vận dụng vào bài thực tế. Mảng thật ra là những bảng tính ảo nằm trên bộ nhớ thôi. Cũng có cột và dòng. Muốn làm gì tại cột nào dòng nào thì gọi đúng phần tử đó giống như gọi 1 ô trên bảng tính thôi. Ví dụ mình có 1 mảng Arr = [B5:C10].value có nghĩa là mình có 1 mảng Arr gồm 6 dòng và 2 cột. Cứ cày thật sự trong 1 tuần là nhuần nhuyễn. Bảo đảm.
 
Upvote 0
Tiêu đề nút bấm lấy giá trị của ô dữ liệu

Em có file (đính kèm) muốn tạo 1 nút bấm có giá trị thay đổi tương ứng với giá trị của ô A1

Nhờ các bác, các cao thủ giúp cho.

AndOrNot
 

File đính kèm

Upvote 0
Em có file (đính kèm) muốn tạo 1 nút bấm có giá trị thay đổi tương ứng với giá trị của ô A1

Nhờ các bác, các cao thủ giúp cho.

AndOrNot

Code vầy là được rồi
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "$A$1" Then Buttons("Button 1").Text = Target.Value
End Sub
 
Upvote 0
Upvote 0
Upvote 0
Ôi... mấy vụ kế toán, xuất, nhập, tồn gì gì đó đừng kêu tôi... tôi chẳng biết gì đâu

Bác ndu96081631 ơi, vấn đề không phải là kế toán hay nhập xuất tồn gì cả, mấu chốt của vấn đề là em muốn nhờ bác xem công thức và có hướng tối ưu để nó chạy nhanh hơn. Bác thử xem giúp em đi.
 
Upvote 0
Xin Hướng dẫn cách insert 1 số n dòng chỉ bằng click chuột

vì không rành VBA lắm nên xin mọi người giúp em vụ này với ạ!
em muốn insert một số n dòng ( n là giá trị của 1 ô trong bảng tính, và tất nhiên n là số nguyên bất kì > 0)^^!
cảm ơn mọi người rất nhiều!
thanks for watching!
 
Upvote 0
vì không rành VBA lắm nên xin mọi người giúp em vụ này với ạ!
em muốn insert một số n dòng ( n là giá trị của 1 ô trong bảng tính, và tất nhiên n là số nguyên bất kì > 0)^^!
cảm ơn mọi người rất nhiều!
thanks for watching!
Record Macro là có code ngay mà :
[GPECODE=vb]
Sub Macro1()
Dim rw As Long
rw = Application.InputBox("Input the Number of rows to insert ", "record Macro ", , , , , , 1)
ir = [A65536].End(3).Row - 1
Rows("" & ir & ":" & rw & "").Insert xlDown, 0
Application.CutCopyMode = 0
End Sub
[/GPECODE]
 
Upvote 0
Các anh cho hỏi trong VBA , em muốn khai báo một mảng là hằng số thì cú pháp như thế nào :

em thử : Const abc as string = Array ( "a","b","c" ) mà không được
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Các anh cho hỏi trong VBA , em muốn khai báo một mảng là hằng số thì cú pháp như thế nào :

em thử : Const abc as string = Array ( "a","b","c" ) mà không được

Hổng có vụ này đâu, khỏi suy nghĩ. Mảng là mảng còn hằng số là hằng số
 
Upvote 0
Hổng có vụ này đâu, khỏi suy nghĩ. Mảng là mảng còn hằng số là hằng số

Ác nhj, giả sử em có một mảng Arr() dữ liệu , bây giờ muốn sửa dụng được mảng này trong tất cả các sub thì hổng lẽ phải chơi kiểu này ah :
PHP:
Public Arr()
Sub Const_Arr()
            Arr = Array("ab",....)
end sub
-------------------------------------
Sub Main()
     Call Const_Arr
......................................
end sub

--> Nếu gặp trường hợp như em : anh sẽ giải quyết thế nào ! chia sẻ với em với }}}}}
 
Upvote 0
Ác nhj, giả sử em có một mảng Arr() dữ liệu , bây giờ muốn sửa dụng được mảng này trong tất cả các sub thì hổng lẽ phải chơi kiểu này ah :
PHP:
Public Arr()
Sub Const_Arr()
            Arr = Array("ab",....)
end sub
-------------------------------------
Sub Main()
     Call Const_Arr
......................................
end sub

--> Nếu gặp trường hợp như em : anh sẽ giải quyết thế nào ! chia sẻ với em với }}}}}
Thì đương nhiên là vậy rồi
- Khai báo arr dạng Public
- Khi chạy code, để khỏi phải mất công gọi đi gọi lại nhiều lần, ta sửa thằng Sub Const_Arr() thành Sub Auto_Open() là được rồi (chạy 1 lần duy nhất khi khởi động file thôi)
 
Upvote 0
Thì đương nhiên là vậy rồi
- Khai báo arr dạng Public
- Khi chạy code, để khỏi phải mất công gọi đi gọi lại nhiều lần, ta sửa thằng Sub Const_Arr() thành Sub Auto_Open() là được rồi (chạy 1 lần duy nhất khi khởi động file thôi)
ok , em đã hiểu thanks anh nhiều
 
Upvote 0
nhờ các anh chi cho xin đoạn code tìm dòng trống đâu tiên
vi du A1--->A6 có số liệu
A7-->A8 trống
A9---> lại tiếp tục có số liệu
tôi muốn tìm A7.
cám ơn mọi người
 
Upvote 0
nhờ các anh chi cho xin đoạn code tìm dòng trống đâu tiên
vi du A1--->A6 có số liệu
A7-->A8 trống
A9---> lại tiếp tục có số liệu
tôi muốn tìm A7.
cám ơn mọi người

Ta có thể thí nghiệm dùng SpecialCells
Mã:
Sub Test()
  Dim rng As Range
  On Error Resume Next
  Set rng = Range("A:A").SpecialCells(4)
  If Not rng Is Nothing Then MsgBox rng.Areas(1).Cells(1, 1).Address
End Sub
 
Upvote 0
nhờ các anh chi cho xin đoạn code tìm dòng trống đâu tiên
vi du A1--->A6 có số liệu
A7-->A8 trống
A9---> lại tiếp tục có số liệu
tôi muốn tìm A7.
cám ơn mọi người
cho nó cái vòng lập để dò tìm , khi dò ra cho hiện thi tên ô và cho nó cái exit sub kế tiếp (vì đã xong việc) nữa là đc thôi
 
Upvote 0
nhờ các anh chi cho xin đoạn code tìm dòng trống đâu tiên
vi du A1--->A6 có số liệu
A7-->A8 trống
A9---> lại tiếp tục có số liệu
tôi muốn tìm A7.
cám ơn mọi người
Bạn thử dòng lệnh này
Mã:
[A:A].Find("", [A65536], , 1, , 1).Activate
 
Upvote 0
Ta có thể thí nghiệm dùng SpecialCells
Mã:
Sub Test()
  Dim rng As Range
  On Error Resume Next
  Set rng = Range("A:A").SpecialCells(4)
  If Not rng Is Nothing Then MsgBox rng.Areas(1).Cells(1, 1).Address
End Sub

tks anh, đúng rồi, anh cho hỏi thêm, các con số (4), làm sao mình biết được vậy anh?
nếu tôi đổi thành
Set rng = Range("A:A").SpecialCells(3)
rng.Select
thì nó lại chọn các vùng có số liệu.
hay như tôi thấy mọi người hay dùng advance filter thì ghi là
AdvancedFilter 2, , [range], 1
nếu mình ghi record macro thì nó dài ngoằn, nên ko biết làm sao biết các con số đó

tks
 
Upvote 0
tks anh, đúng rồi, anh cho hỏi thêm, các con số (4), làm sao mình biết được vậy anh?
nếu tôi đổi thành
Set rng = Range("A:A").SpecialCells(3)
rng.Select
thì nó lại chọn các vùng có số liệu.
hay như tôi thấy mọi người hay dùng advance filter thì ghi là
AdvancedFilter 2, , [range], 1
nếu mình ghi record macro thì nó dài ngoằn, nên ko biết làm sao biết các con số đó

tks

SpecialCells tương đương với thao tác Ctrl + G trên bảng tính
Vậy bạn cứ Ctrl + G, bấm nút Specials, đếm từ trên xuống, mục Blanks nằm vị trí thứ 4
Tôi dùng cách suy đoán này để làm thôi
Tương tự thế với Advanced Filter hay Sort ---> cửa sổ mở ra, ta đếm các nút check từ trên xuống (1 ở trên cùng, 2 kế tiếp...). Vậy thôi
Ẹc... Ẹc...
 
Upvote 0
tks anh, đúng rồi, anh cho hỏi thêm, các con số (4), làm sao mình biết được vậy anh?
nếu tôi đổi thành
Set rng = Range("A:A").SpecialCells(3)
rng.Select
thì nó lại chọn các vùng có số liệu.
hay như tôi thấy mọi người hay dùng advance filter thì ghi là
AdvancedFilter 2, , [range], 1
nếu mình ghi record macro thì nó dài ngoằn, nên ko biết làm sao biết các con số đó

tks

xem thử link này xem http://msdn.microsoft.com/en-us/library/office/aa213567(v=office.11).aspx
 
Upvote 0
Cái dòng code này được không

MsgBox [A1].End(4).Offset(1).Address
Được & Không được
Tức là:
Có lúc "được" & có lúc "hổng được"
Tức là:
Nếu [A2] có dữ liệu thì..............được, còn ngược lại thì........."tèo"
Híc
Số dd của Hải phía bên dưới là số..........đểu hả ????
 
Lần chỉnh sửa cuối:
Upvote 0
Được & Không được
Tức là:
Có lúc "được" & có lúc "hổng được"
Tức là:
Nếu [A2] có dữ liệu thì..............được, còn ngược lại thì........."tèo"
Híc
Số dd của Hải phía bên dưới là số..........đểu hả ????
Dạ sdt đó là của em đó chứ. Bữa viết quên mất số 0908, định bụng sửa lại chữ ký mà dạo này lu bu quá nên chưa vào được trang chỉnh sửa thông tin cá nhân.
 
Upvote 0
hỏi cách thoát một vòng lặp
chào ACE, mình có một vấn đề nhờ ACE giúp,
mình có 2 vòng lặp lồng vào nhau
for i=1 to 10
for j=1 to 10
'các lệnh ở đây
next j
next i
khi i chạy đườc 2 và j chạy tới 5 thì bị lổi, mình muốn thoát vòng lặp j không làm tiếp 6-10. mà nhảy ra lặp i lên 3
nếu dùng exit for thì nó thoát cả 2 vòng lặp.
nếu dùng on error resume next thì nó vẫn tiếp tục tăng j lên 6,7,8,9,10

nhờ ACE giúp dùm, hổng biết câu hỏi có quá ngu hong nữa
tks bà con
 
Upvote 0
hỏi cách thoát một vòng lặp
chào ACE, mình có một vấn đề nhờ ACE giúp,
mình có 2 vòng lặp lồng vào nhau
for i=1 to 10
for j=1 to 10
'các lệnh ở đây
next j
next i
khi i chạy đườc 2 và j chạy tới 5 thì bị lổi, mình muốn thoát vòng lặp j không làm tiếp 6-10. mà nhảy ra lặp i lên 3
nếu dùng exit for thì nó thoát cả 2 vòng lặp.
nếu dùng on error resume next thì nó vẫn tiếp tục tăng j lên 6,7,8,9,10

nhờ ACE giúp dùm, hổng biết câu hỏi có quá ngu hong nữa
tks bà con

Đã thử chưa? Thử code có tốn tiền đau mà cũng hà tiện!
Ai nói là nó thoát ra cả 2 vòng lặp vậy?
 
Upvote 0
Cho em hỏi 1 vấn đề về undo trong excle :
Giả sử e run code sau :
PHP:
Sub GPE()    
[A1:G8].Copy [H1:N8]
End Sub

Bây giờ tại worksheet em muốn ấn ctrl +Z để trở về trạng thái ban đầu ( trước lúc copy vào vùng [H1:N8]) , thì phải bổ sung vào code như thế nào
 
Upvote 0
Cho em hỏi 1 vấn đề về undo trong excle :
Giả sử e run code sau :
PHP:
Sub GPE()    
[A1:G8].Copy [H1:N8]
End Sub

Bây giờ tại worksheet em muốn ấn ctrl +Z để trở về trạng thái ban đầu ( trước lúc copy vào vùng [H1:N8]) , thì phải bổ sung vào code như thế nào

Undo trong VBA không phải là chuyện dễ. Bạn tham khảo thử chổ này:
http://www.j-walk.com/ss/excel/tips/tip23.htm
Nói chung người ta sẽ làm động tác "nhớ" khu vực chuẩn bị thay đổi vào 1 biến. Sau này muốn Undo thì gán giá trị đã nhớ vào khu vực nói trên
 
Upvote 0
Từ VBA trong excel em muốn tắt bỏ cửa sổ Notepad + 1 thông điệp lưu hay không lưu, tìm tòi trên diễn đàn em thử viết đoạn code như sau :
Mã:
Private Const WM_CLOSE As Long = &H10
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
-----------------------------------------------------------------------------------------
Sub Main()
   h = FindWindow("notepad", vbNullString) ' notepad
    SendMessage h, WM_CLOSE, 0, 0
End Sub

*Nhưng mà khi chạy code xong, cửa sổ notepad tự tắt luôn mà chẳng có hộp thoại thông báo nào <--------- ?-+*/
*vấn đề nữa là làm sao mình tìm được tên LpclassName của bất kỳ cửa sở hiện hành nào ? ví dụ như word là OPusAPP <<--- làm sao mình tìm được opusapp ???, giả sửa em có thêm ứng dụng autocad.exe đang chạy thì tên của cửa sổ là gì ?+-+-+-+

--> mong các anh giải đáp vướng mắc của em !
 
Lần chỉnh sửa cuối:
Upvote 0
Từ VBA trong excel em muốn tắt bỏ cửa sổ Notepad + 1 thông điệp lưu hay không lưu, tìm tòi trên diễn đàn em thử viết đoạn code như sau :
Mã:
Private Const WM_CLOSE As Long = &H10
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
-----------------------------------------------------------------------------------------
Sub Main()
   h = FindWindow("notepad", vbNullString) ' notepad
    SendMessage h, WM_CLOSE, 0, 0
End Sub

*Nhưng mà khi chạy code xong, cửa sổ notepad tự tắt luôn mà chẳng có hộp thoại thông báo nào <--------- ?-+*/
Chẳng biết nữa, nhưng tôi chạy code trên thì có thông báo xuất hiện (hỏi Save...)

*vấn đề nữa là làm sao mình tìm được tên LpclassName của bất kỳ cửa sở hiện hành nào ? ví dụ như word là OPusAPP <<--- làm sao mình tìm được opusapp ???, giả sửa em có thêm ứng dụng autocad.exe đang chạy thì tên của cửa sổ là gì ?+-+-+-+

--> mong các anh giải đáp vướng mắc của em !
Dùng hàm này thử xem:
Mã:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Function WinClassName(ByVal WinCap As String) As String
  Dim WinWnd As Long, RetVal As Long, lpClassName As String
  WinWnd = FindWindow(vbNullString, WinCap)
  If WinWnd <> 0 Then
    lpClassName = Space(256)
    RetVal = GetClassName(WinWnd, lpClassName, 256)
    WinClassName = Left$(lpClassName, RetVal)
  End If
End Function
Sub Test()
  MsgBox WinClassName("Untitled - Notepad")
  MsgBox WinClassName("Document1 - Microsoft Word")
End Sub
 
Upvote 0
Chẳng biết nữa, nhưng tôi chạy code trên thì có thông báo xuất hiện (hỏi Save...)


Dùng hàm này thử xem:
Mã:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Function WinClassName(ByVal WinCap As String) As String
  Dim WinWnd As Long, RetVal As Long, lpClassName As String
  WinWnd = FindWindow(vbNullString, WinCap)
  If WinWnd <> 0 Then
    lpClassName = Space(256)
    RetVal = GetClassName(WinWnd, lpClassName, 256)
    WinClassName = Left$(lpClassName, RetVal)
  End If
End Function
Sub Test()
  MsgBox WinClassName("Untitled - Notepad")
  MsgBox WinClassName("Document1 - Microsoft Word")
End Sub

Hàm WinClassName thì tuyệt rồi}}}}} ! hix nhưng mà cái vụ sendmessega thì máy em nó cứ out luôn mà chẳng thông báo gì ( win 7 /32bits) <---- hổng lẽ win lỗi
Để em thử ngâm cứu thêm!
cảm ơn anh nhiểu !
 
Upvote 0
Hàm WinClassName thì tuyệt rồi}}}}} ! hix nhưng mà cái vụ sendmessega thì máy em nó cứ out luôn mà chẳng thông báo gì ( win 7 /32bits) <---- hổng lẽ win lỗi
Để em thử ngâm cứu thêm!
cảm ơn anh nhiểu !

Tôi cũng dùng Win7 nè
Có khi nào bạn mở file txt có sẵn không? Mở file lên mà chẳng thay đổi gì thì bác Bill đâu có hỏi Save
 
Upvote 0
Chuẩn rồi ! anh bắt đúng bệnh rồi ! Thanks anh thêm lần nữa}}}}}}}}}}}}}}}}}}}}

Mình nói thêm: Mấy câu bạn vừa hỏi mà lại cho vào topic DÀNH CHO CÁC THÀNH VIÊN MỚI HỌC... sao?
Nếu đúng thật lính mới mà hỏi mấy câu này chắc mình.. TRỐN luôn quá
 
Upvote 0
Mình nói thêm: Mấy câu bạn vừa hỏi mà lại cho vào topic DÀNH CHO CÁC THÀNH VIÊN MỚI HỌC... sao?
Nếu đúng thật lính mới mà hỏi mấy câu này chắc mình.. TRỐN luôn quá
Dạ,Topic "Dành cho các thành viên mới học.." thì câu hỏi của em là "dành cho các thành viên mới học windowAPI" ^^
*Tại vì em biết topic này là anh lập ra --> anh theo dõi thường xuyên --> em post câu hỏi vào đây , chắc anh cũng không TRỐN luôn đâu :--=0,
* em thấy những ai post bài vào topic này đều có "quà" của anh hết --> nên em bắt chước làm theo thôi !

p/s : nếu mà anh thấy không hợp với topic , thì anh xóa hoặc di chuyển sang nơi khác hộ em !
 
Upvote 0
Dừng chương trình khi có điều kiện

Mã:
For  I = 1  to 10
     If a = b then
          For j=1 to 10 
               If c<d then …….
               End if
         Next
      End if
Next
Mình muốn nếu thỏa mãn điều kiện c<d thì chương trình sẽ dừng lại và lấy giá trị i và j lúc đấy. Vậy chỗ "if c<d then" sẽ phải viết thế nào vậy?
 
Upvote 0
Mã:
For  I = 1  to 10
     If a = b then
          For j=1 to 10 
               If c<d then …….
               End if
         Next
      End if
Next
Mình muốn nếu thỏa mãn điều kiện c<d thì chương trình sẽ dừng lại và lấy giá trị i và j lúc đấy. Vậy chỗ "if c<d then" sẽ phải viết thế nào vậy?
Thử viết như vầy xem nó có chạy đúng không
PHP:
For  I = 1  to 10
     If a = b then
          For j=1 to 10 
               If c<d then
 …….
Exit For
Exit For
               End if
         Next j
      End if
Next I
 
Upvote 0
Hổng chắc đâu 3T à,

Mình muốn nếu thỏa mãn điều kiện c<d thì chương trình sẽ dừng lại lấy giá trị i và j lúc đấy. Vậy chỗ "if c<d then" sẽ phải viết thế nào vậy?

Chương trình dừng lại thì dễ rồi (dùng lệnh End). Nhưng dừng xong rồi trị i, j lấy ra bỏ đâu thì tôi bí.
 
Upvote 0
Hổng chắc đâu 3T à,



Chương trình dừng lại thì dễ rồi (dùng lệnh End). Nhưng dừng xong rồi trị i, j lấy ra bỏ đâu thì tôi bí.
Thì cái chỗ .... ở dưới If.. then tác giả muốn nó lấy và ghi vào đâu thì tác giả tính, đến đó thì I và J đều không chạy nữa rối mà.
Ví dụ [J1].Value= I : [J2].Value= J chẵn hạn.
 
Upvote 0
Ý tôi là:
Nếu chỉ thoát khỏi vòng lặp (exit for) thì i, j còn đó.
Nếu thoát khỏi sub/function (exit sub/function) thì nếu i, j là biến nội thì chúng bị giải toả hêt. Phải đặt là biến toàn cục mới còn.
Nếu dừng chương trình (lời của chủ đề, tức là end) thì biến gì cũng mất hết. Phương pháp nào đó để moi lại hay giữ thì tôi chưa học tới.

Trong trường hợp thứ 3, nếu muốn giữ thì phải giữ trước khi thoát chứ không thể "...dừng lại và lấy giá trị..." được

Người hỏi bài này cần học lại về phạm vi của biến, chương trình con và chương trình chính, và dùng đúng từ ngữ.
 
Lần chỉnh sửa cuối:
Upvote 0
tập tành VBA

Các bác ơi, em mới tập tành code vba nên phải nói là còn rất chi là gà :3. Em cần xin code 1 hàm (Function) tính tổng của cell trong vùng chọn ( tất nhiên là em biết trong excel đã có hàm sum). Bác nào có thể giúp em để em tham khảo với nhé. Tks các bác nhiều
 
Upvote 0
Upvote 0
Ý tôi là:
Nếu chỉ thoát khỏi vòng lặp (exit for) thì i, j còn đó.
Nếu thoát khỏi sub/function (exit sub/function) thì nếu i, j là biến nội thì chúng bị giải toả hêt. Phải đặt là biến toàn cục mới còn.
Nếu dừng chương trình (lời của chủ đề, tức là end) thì biến gì cũng mất hết. Phương pháp nào đó để moi lại hay giữ thì tôi chưa học tới.

Trong trường hợp thứ 3, nếu muốn giữ thì phải giữ trước khi thoát chứ không thể "...dừng lại và lấy giá trị..." được

Người hỏi bài này cần học lại về phạm vi của biến, chương trình con và chương trình chính, và dùng đúng từ ngữ.

Bài của bác Ba Tê là thỏa ý người hỏi rồi. Bài của bạn tuy đúng nhưng làm người ta sợ. Tôi đã học VBA 5 năm nay nhưng cũng chưa học đến những bài này. Với những bạn mới học VBA thì cứ tà tà làm tới đâu học tới đó, không cần quan tâm bắt đầu từ đâu, càng đơn giản hóa vấn đề càng dễ học hỏi, cái gì cần biết thì dần dần sẽ biết (có lẽ do mình bảo thủ chăng ?).
 
Lần chỉnh sửa cuối:
Upvote 0
Bài của bác Ba Tê là thỏa ý người hỏi rồi. Bài của bạn tuy đúng nhưng làm người ta sợ. Tôi đã học VBA 5 năm nay nhưng cũng chưa học đến những bài này. Với những bạn mới học VBA thì cứ tà tà làm tới đâu học tới đó, không cần quan tâm bắt đầu từ đâu, càng đơn giản hóa vấn đề càng dễ học hỏi, cái gì cần biết thì dần dần sẽ biết (có lẽ do mình bảo thủ chăng ?).

Sự không cùng ngôn ngữ đưa ra việc một câu hỏi phải đưa đi đưa lại mấy lần mới đúng ý người hỏi. Cuối cùng dẫn đến việc một đề bài đáng lẽ chỉ cần trung bình 3 câu trả lời (mỗi câu đề nghị một cách giải), vì vấn đề hiểu lầm nảy sinh ra thành hơn chục câu.

Tôi không biết gì về tôn chỉ hoạt động của diễn đàn này và hoàn toàn mù tịt về web site này nên điều sau đây tôi chỉ đoán mò:
Database phải chứa và truy cập số lượng bài nhiều gấp mấy lần bình thường cho nên cache của nó bị quá tải. Đưa đến tình trạng chạy chậm và thường xuyên time out vào giờ cao điểm.

Nếu điều trên không đúng thì tôi xin lỗi mọi người và hứa rằng kể từ nay tôi không nói chuyện về cách thức làm việc nữa.
 
Upvote 0
Tôi làm việc với đủ tầng lớp người khác nhau nhiều năm. Đâu dễ giận vậy?
Tôi chỉ nói "không bàn cách thức làm việc", có nghĩa là tôi sẵn sàng chìu theo số đông, họ làm gì tôi theo nấy, không xúi dục ai theo đường lối của mình nữa.
 
Upvote 0
Trở lại vấn đề câu hỏi. Câu hỏi dùng từ "dừng chương trình" nên tôi mới đề nghị dùng lệnh "end"
Nếu nguời hỏi muốn biết làm cách nào để thoát ra khỏi 2 vòng lặp thì phải làm như sau:

Mã:
For  I = 1  to 10
     If a = b then
          For j=1 to 10 
               If c<d then Exit For[COLOR=#008000] ' nhảy ra khỏi vòng trong[/COLOR]
               End if
         Next
         If j <= 10 Then Exit For[COLOR=#008000] ' nhảy ra khỏi vòng ngoài[/COLOR]
      End if
Next
[COLOR=#008000]' ở đây có thể lấy trị i, j.
' Tuy nhiên vì vòng lặp j chứa trong điều kiện If a = b cho nên trị j là trị chỉ có ý nghĩa tuỳ theo điều kiện
' Cách tốt hơn là lấy i, j ngay lúc thoả điều kiện c<d và dùng lệnh goto để nhảy vào một label nghay sau hai vòng lặp
[/COLOR]

Dù dùng cách nào đi nữa thì code ví dụ của chủ đề đều đưa ra một trị J không đáng tin cậy. Nếu điều kiện a=b không thoả thì J chứa trị trước khi vòng lặp i được thực hiện
 
Upvote 0
Trở lại vấn đề câu hỏi. Câu hỏi dùng từ "dừng chương trình" nên tôi mới đề nghị dùng lệnh "end"
Nếu nguời hỏi muốn biết làm cách nào để thoát ra khỏi 2 vòng lặp thì phải làm như sau:

Mã:
For  I = 1  to 10
     If a = b then
          For j=1 to 10 
               [COLOR=#ff0000]If c<d then Exit For [/COLOR][COLOR=#008000]' nhảy ra khỏi vòng trong[/COLOR]
               [COLOR=#ff0000]End if[/COLOR]
         Next
         [COLOR=#ff0000]If j <= 10 Then Exit For[/COLOR][COLOR=#008000] ' nhảy ra khỏi vòng ngoài[/COLOR]
      End if
Next
[COLOR=#008000]...
[/COLOR]
...

VetMini hoặc bạn nào biết giúp mình câu hỏi này:

Khi viết If .... Then .... thì không cần phải End if (giống như câu lệnh If j <= 10 Then Exit For ở trên)

Vậy tại sao trong đoạn mã dưới đây đã If c<d then Exit For rồi mà vẫn phải End if ?
If c<d then Exit For ' nhảy ra khỏi vòng trong
End if

Câu hỏi thành tâm, không có ý gì khác nếu như đoạn code trên có sơ xuất. Thanks !
 
Upvote 0
VetMini hoặc bạn nào biết giúp mình câu hỏi này:

Khi viết If .... Then .... thì không cần phải End if (giống như câu lệnh If j <= 10 Then Exit For ở trên)

Vậy tại sao trong đoạn mã dưới đây đã If c<d then Exit For rồi mà vẫn phải End if ?
If c<d then Exit For ' nhảy ra khỏi vòng trong
End if

Câu hỏi thành tâm, không có ý gì khác nếu như đoạn code trên có sơ xuất. Thanks !

Xin lỗi, quên xoá dòng ấy. Lúc compile sẽ báo lỗi.

Luật chính thức như thế này:
If là một lệnh rẽ nhánh có điều kiện
Cấu trúc Then ... bảo compiler rằng điểm nhảy rẽ (nếu không thoả điều kiện) là lệnh (dòng) kế tiếp
Cấu trúc Then (xuống dòng) bảo compiler rằng điểm nhảy rẽ (nếu không thoả điều kiện) là dòng Else, ElseIf hoặc End If gần nhất.

(*) compiler là bộ máy dịch ngôn ngữ.

=== chỉnh thêm ===
Trên thực tế, compiler sẽ hiểu lầm cái End If đó là điểm kết của cái If a = b trước đây. Thế là lộn tùng phèo hết. Tôi nghĩ là sẽ báo lỗi ở dòng For-Next (hai code blocks tréo nhau) thay vì end if.
 
Lần chỉnh sửa cuối:
Upvote 0
VetMini
Cấu trúc Then ... bảo compiler rằng điểm nhảy rẽ (nếu không thoả điều kiện) là lệnh (dòng) kế tiếp
Cấu trúc Then (xuống dòng) bảo compiler rằng điểm nhảy rẽ (nếu không thoả điều kiện) là dòng Else, ElseIf hoặc End If gần nhất.

Trong VBA thường xuyên dùng If ... Then và lâu nay cứ hiểu nôm na là Nếu...Thì mà phang. Giờ mới được biết nghĩa đen của nó.

Cám ơn VetMini nhiều !
 
Lần chỉnh sửa cuối:
Upvote 0
Hỏi về cách chuyển đổi định dạng?

Xin chào Thầy cô và Anh Chị trong GPE!
Em đang gặp phải một tình trạng là file định dạng dữ liệu vừa kiểu ngày tháng năm và vừa kiểu dạng text.
Hiện giờ Em đã định dạng dữ liệu về kiểu "dd/mm/yyy" nhưng có một số dữ liệu kiểu text không thể chuyển đổi được mà buộc phải kích đúp chuột vào ô đó thì mới được.
Nếu dữ liệu ót thì không sao nhưng bảng dữ liệu cũng khá nhiều vì vậy Em muốn hỏi GPE có cách nào để chuyển đổi nhanh hơn không ạ!
Cụ thể hơn thì Thầy cô và Anh Chị xem file kèm ạ!
Em xin cảm ơn!
 

File đính kèm

Upvote 0
Thử công thức này xem nhé :

PHP:
=IF(ISTEXT(B3),DATE(RIGHT(B3,4),MID(B3,4,2),LEFT(B3,2)),B3)
Copy xuống
 
Upvote 0
OK đó Hoa àh, Cảm ơn Hoa nhiều nhé như vậy mình sẽ phải làm bên cạnh sau đó Copypase sang bảng dữ liệu cũ.
Với code thì sao Hoa có cách nào không? Hì...đã lười lại muốn lười hơn đó mà.. (^_-)!
 
Upvote 0
Xin chào Thầy cô và Anh Chị trong GPE!
Em đang gặp phải một tình trạng là file định dạng dữ liệu vừa kiểu ngày tháng năm và vừa kiểu dạng text.
Hiện giờ Em đã định dạng dữ liệu về kiểu "dd/mm/yyy" nhưng có một số dữ liệu kiểu text không thể chuyển đổi được mà buộc phải kích đúp chuột vào ô đó thì mới được.
Nếu dữ liệu ót thì không sao nhưng bảng dữ liệu cũng khá nhiều vì vậy Em muốn hỏi GPE có cách nào để chuyển đổi nhanh hơn không ạ!
Cụ thể hơn thì Thầy cô và Anh Chị xem file kèm ạ!
Em xin cảm ơn!
1 cách thủ công:
1/ Nhập số 1 vào 1 ô nào đó, Copy
2/ Chọn nguyên vùng dữ liệu muốn chuyển, Paste special - Multiply
3/ Format vùng vừa Paste kiểu Date mà bạn muốn.
4/ Xóa ô vừa nhập số 1 hồi nãy.
 
Upvote 0
1 cách thủ công:
1/ Nhập số 1 vào 1 ô nào đó, Copy
2/ Chọn nguyên vùng dữ liệu muốn chuyển, Paste special - Multiply
3/ Format vùng vừa Paste kiểu Date mà bạn muốn.
4/ Xóa ô vừa nhập số 1 hồi nãy.

Thầy ạ! Em làm như thế này Nhập số một theo các ngày tương ứng rồi sau đó Paste special - Multiply thì những giá trị dạng text nó vẫn là số 1 Thầy ạ!
Thầy có thể gửi video hướng dẫn lên con coi với được không ạ.+-+-+-+
Cảm ơn Thầy!
 
Upvote 0
Thầy ạ! Em làm như thế này Nhập số một theo các ngày tương ứng rồi sau đó Paste special - Multiply thì những giá trị dạng text nó vẫn là số 1 Thầy ạ!
Thầy có thể gửi video hướng dẫn lên con coi với được không ạ.+-+-+-+
Cảm ơn Thầy!
Không hiểu bạn làm kiểu gì và không biết dữ liệu của bạn có các dạng ra sao?
Với dữ liệu như file mẫu của bạn ở trên thì tôi đã làm như vậy và đã ra kết quả là ngày tháng.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Không hiểu bạn làm kiểu gì và không biết dữ liệu của bạn có các dạng ra sao?
Với dữ liệu như file mẫu của bạn ở trên thì tôi đã làm như vậy và đã ra kết quả là ngày tháng.
Con làm như thế này Thầy ạ:
[video=youtube;sUWYMqsPzT4]http://www.youtube.com/watch?v=sUWYMqsPzT4&amp;feature=youtu.be[/video]
 
Upvote 0
Con làm như thế này Thầy ạ:
[video=youtube;sUWYMqsPzT4]http://www.youtube.com/watch?v=sUWYMqsPzT4&amp;feature=youtu.be[/video]

Không xem được video, nó bảo "Đây là video riêng tư"
Nói chung, bạn làm đúng theo hướng dẫn bên trên không?
Chỉ gõ số 1 vào 1 ô nào đó thôi. (Như file trong bài #197 tôi nhập vào ô I6, ô này phải là Number, chỉ hiện nội dung là số 1) Rồi copy 1 ô I6 đó, chọn vùng cần chuyển sang dạng date (Trong file tôi tô chọn vùng B3:B10), Past special - Multiply. Nó sẽ chuyển thành dạng Number, Format vùng này thành Date lại là xong, xóa ô I6
Những ô là Text nhưng không có giống dạng ngày tháng thì lỗi .
 
Lần chỉnh sửa cuối:
Upvote 0
Thầy ạ! Em làm như thế này Nhập số một theo các ngày tương ứng rồi sau đó Paste special - Multiply thì những giá trị dạng text nó vẫn là số 1 Thầy ạ!
Thầy có thể gửi video hướng dẫn lên con coi với được không ạ.+-+-+-+
Cảm ơn Thầy!

Không cần phải nhập bất cứ số nào vào cell nào cả
Bạn làm vầy nhé:
- Chọn 1 cell rổng bất kỳ rồi Ctrl + C (copy cell rổng ấy)
- Quét chọn vùng dữ liệu chứa ngày tháng của bạn rồi Click chuột phải, chọn Paste Special ---> Check mục Values và mục Add ---> nhấn nút OK
Xong


[video=youtube;QJMoHqbspX8]http://www.youtube.com/watch?v=QJMoHqbspX8&feature=youtu.be[/video]
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom