Hỏi đáp VBA trong chủ đề "Chập chững đến VBA" (1 người xem)

Liên hệ QC

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

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

Hix, từ trước tới giờ dùng excel cũng như là word thôi, chỉ biết gõ chữ.
Nay đào được cái bài này cứ nghĩ là sẽ có cơ hôi học hỏi thêm.
Ôi thì mình chập chững như đứa trẻ đang tập đi trong nhà, được bác SA_QD dẫn đi từng bước với những ví dụ đơn giản trong cuộc sống, rồi phím tắt để vào cửa sổ Immediate. Hướng dẫn gõ từng code và giải thích cặn kẽ. Thật dễ tiếp thu biết bao nhiêu.
Sang ngày hôm sau. Chỉ 1 ngày thôi. 1 thành phố đập vào mắt với bao cơ man là Macro, PHP Code, Hàm, Biến …..
Đứa trẻ đã bị bỏ rơi, lang thang , bơ vơ không biết níu vào đâu.
Dập tắt 1 ước vọng tập đi :(
 
Upvote 0
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 đỡ!

Cái này đâu cần phải dùng code dài thoòng loòng như vậy chứ! Chỉ cần vầy thôi:

PHP:
Private Sub CommandButton1_Click()
  Dim MyArr, MyRng As Range
  MyArr = WorksheetFunction.Transpose(Sheets("Form").Range("C4:C34").Value)
  Set MyRng = Sheets("Thong Tin KH").Range("B65536").End(xlUp)
  If MyRng.Address = "$B$4" Then Set MyRng = MyRng.Offset(2) Else Set MyRng = MyRng.Offset(1)
  MyRng.Resize(, 31) = MyArr
  Set MyRng = Nothing
End Sub

Bạn xem File nhé!
 

File đính kèm

Upvote 0
Trước tới giờ dùng excel cũng như word thôi, chỉ biết gõ chữ.
Nay đào được cái bài này cứ nghĩ là sẽ có cơ hôi học hỏi thêm.
Ôi thì mình chập chững như đứa trẻ đang tập đi trong nhà, được bác SA_QD dẫn đi từng bước với những ví dụ đơn giản trong cuộc sống, rồi phím tắt để vào cửa sổ Immediate. Hướng dẫn gõ từng code và giải thích cặn kẽ. Thật dễ tiếp thu biết bao nhiêu.
Sang ngày hôm sau. Chỉ 1 ngày thôi. 1 thành phố đập vào mắt với bao cơ man là Macro, PHP Code, Hàm, Biến …..
Đứa trẻ đã bị bỏ rơi, lang thang , bơ vơ không biết níu vào đâu. Dập tắt 1 ước vọng tập đi :(

Diễn đàn mà bạn, có fải là quyễn sách bạn mua đâu? Bạn thay vì ngồi trách ai đó thì để thời gian tìm hiểu fương thức nào đó đề tự học để tiếp thu kho tàng trên GPE.COM thì hay hơn!

(húc thành công nay mai!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Xin đuợc các cao thủ cho ý kiến , tôi có vấn đề là trên 1 sheet excel tôi có rất nhiều checkbox
nếu checkbox nào được đánh thì tổng được 1 còn ngược lại tổng là 0

PHP:
If CheckBox1.Value = True Then
           DIEM =  1
else
          DIEM =  0
End If

If CheckBox2.Value = True Then
           DIEM =  1
else
          DIEM =  0
 End If

If CheckBox3.Value = True Then
           DIEM =  1
else
          DIEM =  0
 End If

...............
tất cả những thao tác trên là như nhau chỉ khác nhau checkbox,
nếu làm như vậy thì rất cực và lâu tôi muốn dùng 1 hàm để gọi tất cả nhưng không biết kiểu dữ liệu là gì mong các cao thủ cho ý kiến

PHP:
Fuction DIEM(bien as kiểu dữ liệu) as Integer
    lenh
    lenh
   lenh
kiểu dữ liệu ở đây là gì?
 
Upvote 0
Thử dùng vòng lặp xem? Duyệt qua tất cả các checkbox, dùng and hoặc or theo ý của mình.
 
Upvote 0
Theo kyo thì dùng Controls("checkbox" & i).value để lập thì sẽ tiết kiệm thời gian hơn. Giả sử có 10 cái checkbox được đánh số từ 1 đến 10

PHP:
For i=1 to 10
       If UserForm.Controls("checkbox" & i).value=True then
              diem=1
       else
              diem=0
       end if
next i
 
Upvote 0
Dạ cảm ơn, nhưng mà mình viết chương trình con thì hay hơn
 
Upvote 0
Xin đuợc các cao thủ cho ý kiến , tôi có vấn đề là trên 1 sheet excel tôi có rất nhiều checkbox
nếu checkbox nào được đánh thì tổng được 1 còn ngược lại tổng là 0

PHP:
If CheckBox1.Value = True Then
           DIEM =  1
else
          DIEM =  0
End If

If CheckBox2.Value = True Then
           DIEM =  1
else
          DIEM =  0
 End If

If CheckBox3.Value = True Then
           DIEM =  1
else
          DIEM =  0
 End If

...............
tất cả những thao tác trên là như nhau chỉ khác nhau checkbox,
nếu làm như vậy thì rất cực và lâu tôi muốn dùng 1 hàm để gọi tất cả nhưng không biết kiểu dữ liệu là gì mong các cao thủ cho ý kiến

PHP:
Fuction DIEM(bien as kiểu dữ liệu) as Integer
    lenh
    lenh
   lenh
kiểu dữ liệu ở đây là gì?
Bạn tổng hợp các checkbox đang check trên sheet, vậy đâu cần biến gì chứ
Có thể code thể này:
PHP:
Function Diem() As Long
  Dim cbx As OLEObject
  Application.Volatile
  For Each cbx In ActiveSheet.OLEObjects
    If cbx.progID = "Forms.CheckBox.1" Then
      If cbx.Object.Value Then Diem = Diem + 1
    End If
  Next
End Function
Lưu ý:
- Checkbox này là ActiveX control nằm trên sheet
- Phải bấm F9 để cập nhật khi có thay đổi
 
Upvote 0
Tôi thì viết kiểu khác:
Căn cứ theo các yêu cầu:

PHP:
If CheckBox1.Value = True Then
   DIEM =  1
else
   DIEM =  0
End If
If CheckBox2.Value = True Then
   DIEM =  1
else
   DIEM =  0
 End If

If CheckBox3.Value = True Then
   DIEM =  1
else
   DIEM =  0
End If
...............

Tôi viết vầy:

PHP:
Function Diem(n As Long) As Long
  Application.Volatile
Dim Ischeck As Boolean
  Ischeck = False
  For i = 1 To n
      Ischeck = Ischeck Or ActiveSheet.OLEObjects("Checkbox" & i).Object.Value
  Next
Diem = IIf(Ischeck, 1, 0)
End Function

Cú pháp hàm:
Nếu trên sheet có 5 checkbox:
=Diem(5)

Và có thể tính Diem(3), Diem(2) từ trên xuống dưới.

Tuy vậy, mỗi checkbox đều có thuộc tính LinkedCell, sau khi gán LinkedCells cho vùng A1:An, tôi chỉ cần dùng công thức thường của Excel cũng tính ra điểm:

TinhDiem.jpg


1. Chỉ cần 1 True là có 1 điểm, bao nhiêu True cũng chỉ 1 điểm:

=1*(SUMPRODUCT(A1:A6*1)>0)

2. Mỗi True 1 điểm:

=SUMPRODUCT(A1:A6*1)
 
Upvote 0
em có 1 bài xin anh em diễn đàn chỉ giúp là: vị trí 1b = 1a * i với i= 1 - 10 step 0.1, sao cho 1b<1c thì cho ra kết quả 1b,không thì kết quả là 1c
và tính hết cho các dòng trong excel.
ý nghĩa bài toán là với giá trị a nhập vào được giá trị b xuất ra, vậy b tăng lên bao nhiêu lần thì sẽ = c với i là hệ số an toàn để b đạt được c.
E mới làm được 1 hàng không biết sao làm được nhiều hàng xin mọi người giúp.
Em cảm ơn nhiều.
 

File đính kèm

Upvote 0
em có 1 bài xin anh em diễn đàn chỉ giúp là: vị trí 1b = 1a * i với i= 1 - 10 step 0.1, sao cho 1b<1c thì cho ra kết quả 1b,không thì kết quả là 1c
và tính hết cho các dòng trong excel.
ý nghĩa bài toán là với giá trị a nhập vào được giá trị b xuất ra, vậy b tăng lên bao nhiêu lần thì sẽ = c với i là hệ số an toàn để b đạt được c.
E mới làm được 1 hàng không biết sao làm được nhiều hàng xin mọi người giúp.
Em cảm ơn nhiều.
Để tôi mô tả lại bài toán của bạn xem có đúng không nha:
- Với c là giá trị có sẵn
- Nhập vào giá trị a
- So sánh:
1> Nếu a >= c thì gán c vào b
2> Nếu a < c thì nhân số a lần lượt với các số 1.1, 1.2, 1.3... vân vân... đến khi nào a gần bằng c thì ngưng và gán kết quả vào b

--------------
Có phải đúng vậy không?
 
Upvote 0
Dạ bài toán em như vậy:
với 1 lực dọc gán vô (a) sẽ ra 1 lượng thép là (b)
Và chủ đầu tư cần thiết kế với hệ số an toàn dao động từ :1.1 - 2
nên em giả định hệ số này là i với chạy từ 1 đến 10 step 0.1
sao đó: b = a * i
so sánh b với c
tóm lại là:
- c có sẵn ok
- gán giá trị a
- b =a * i với i chạy từ 1 đến 10 step 0.1
sao cho
b <= c thì b=c
Nếu a < c thì nhân số a lần lượt với các số 1.1, 1.2, 1.3... vân vân... đến khi nào a gần bằng c thì ngưng và gán kết quả vào b--------------
sư phụ sửa cái code dùm em nhé..
Với anh cho em hỏi có chổ nào hay anh có dạy cái VBA này không hay anh có biết ở đâu dạy môn này chỉ em để đi học ...em dốt cái này lắm...
em cảm ơn anh nhiều.
Em lập 2 vòng
1 vòng cho K chạy theo dòng
i là hệ số an toàn chạy từ 1 đến 10 step 0.1
mà nó chỉ hiểu thằng k
không hiều thằng i......
 
Upvote 0
Đoán già đoán non thôi nhé: Có thể dùng 2 FOR lồng nhau.
Bạn nên biết cách chạy theo "vết" bằng mở cửa sổ Macro, chuyển điểm nháy đến macro cần chạy, gõ F8.
Khi nó tạm dừng, bạn có thể chuyển sang cửa sổ Excel để xem kết quả.
 
Upvote 0
Dạ bài toán em như vậy:
với 1 lực dọc gán vô (a) sẽ ra 1 lượng thép là (b)
Và chủ đầu tư cần thiết kế với hệ số an toàn dao động từ :1.1 - 2
nên em giả định hệ số này là i với chạy từ 1 đến 10 step 0.1
sao đó: b = a * i
so sánh b với c
tóm lại là:
- c có sẵn ok
- gán giá trị a
- b =a * i với i chạy từ 1 đến 10 step 0.1
sao cho
b <= c thì b=c
Nếu a < c thì nhân số a lần lượt với các số 1.1, 1.2, 1.3... vân vân... đến khi nào a gần bằng c thì ngưng và gán kết quả vào b--------------
sư phụ sửa cái code dùm em nhé..
Với anh cho em hỏi có chổ nào hay anh có dạy cái VBA này không hay anh có biết ở đâu dạy môn này chỉ em để đi học ...em dốt cái này lắm...
em cảm ơn anh nhiều.
Em lập 2 vòng
1 vòng cho K chạy theo dòng
i là hệ số an toàn chạy từ 1 đến 10 step 0.1
mà nó chỉ hiểu thằng k
không hiều thằng i......

Đoán và làm đại... hên thì trúng
PHP:
Sub Test()
  Dim n As Double, lR As Long, tmp As Double, tmpVal As Double
  On Error Resume Next
  With Range("A1:C10000")
    sArray = .Value
    For lR = 1 To UBound(sArray, 1)
      n = 1
      If sArray(lR, 1) <> "" Then
        tmpVal = CDbl(sArray(lR, 1))
        If tmpVal > 0 Then
          If tmpVal < sArray(lR, 3) Then
            Do Until tmpVal * n > sArray(lR, 3)
              tmp = tmpVal * n
              n = n + 0.1
            Loop
            sArray(lR, 2) = tmp
          Else
            sArray(lR, 2) = tmpVal
          End If
        End If
      End If
    Next
    .Value = sArray
  End With
End Sub
Phải IF nhiều là vì phòng các trường hợp sau:
- Bỏ qua các cell rổng
- Giá trị nhập vào mà <=0 thì nhân biết đến khi nào mới... ra
 

File đính kèm

Upvote 0
Public Sub qk()
Dim a As Range, b As Range, c As Range, i As Single, K As Integer
For K = 1 To 100
For i = 1 To 10 Step 0.1
Cells(K, 2).Formula = Cells(K, 1).Value * i
K = K + 1
i = i + 0.1
Next K
Next i
If Cells(K, 2).Value < Cells(K, 3).Value Then
Cells(K, 2).Value = Cells(K, 3).Value
Else
Cells(K, 2).Value = Cells(K, 2).Value
End If
End Sub
em sửa code vậy cũng ko chạy được....
bác nào sửa dùm code với....
 
Upvote 0
Chợt nghĩ ra cách khác:
PHP:
Sub Test()
  Dim lR As Long, tmp As Double, tmpVal As Double
  On Error Resume Next
  With Range("A1:C10000")
    sArray = .Value
    For lR = 1 To UBound(sArray, 1)
      If sArray(lR, 1) <> "" Then
        tmpVal = CDbl(sArray(lR, 1))
        If tmpVal > 0 Then
          If tmpVal < sArray(lR, 3) Then
            sArray(lR, 2) = Int(sArray(lR, 3) * 10 / tmpVal) * tmpVal / 10
          Else
            sArray(lR, 2) = tmpVal
          End If
        End If
      End If
    Next
    .Value = sArray
  End With
End Sub
Nếu đúng thì áp dụng, không đúng thì vui lòng mô tả lại vấn đề cho rõ hơn
 
Upvote 0
Public Sub qk()
Dim a As Range, b As Range, c As Range, i As Single, K As Integer
For K = 1 To 100
For i = 1 To 10 Step 0.1
Cells(K, 2).Formula = Cells(K, 1).Value * i
K = K + 1
i = i + 0.1
Next K
Next i
If Cells(K, 2).Value < Cells(K, 3).Value Then
Cells(K, 2).Value = Cells(K, 3).Value
Else
Cells(K, 2).Value = Cells(K, 2).Value
End If
End Sub
em sửa code vậy cũng ko chạy được....
bác nào sửa dùm code với....
Bạn vô lý thiệt, đã góp ý cho bạn ở topic này mà hình như bạn chẳng thèm đọc gì cả: Đừng bao giờ cho câu lệnh thay đổi giá trị biến chạy vào trong vòng For, giá trị này sẽ tự động tăng. Bạn bỏ 2 câu lệnh K=K+1 và i=i+0.1 đi.
Thêm nữa, vòng For i nằm trong vòng For K, do đó Next i phải được đặt trước Next K, hoặc bạn cứ để Next cũng được, VBA sẽ tự biết đây là Next của biến nào.
 
Upvote 0
Em cảm ơn sư phụ Duyệt rất nhiều.....
Chắc trình độ còn thấp quá chưa hiểu hết cái cốt lõi nên chưa lập được..
Anh Duyệt cho em hỏi anh có mớ lớp dạy cho em đang kí học với
thật sự em đang cần học cái này lắm
Cho em xin dthoai hay nick yahoo Anh nhé....
 
Upvote 0
Em không hiểu câu lệnh: "On Error Resume Next" và câu "sArray = .Value" ý nghĩa là sao vậy anh.Cảm ơn anh rất nhiều.
 
Upvote 0
Em không hiểu câu lệnh: "On Error Resume Next" và câu "sArray = .Value" ý nghĩa là sao vậy anh.Cảm ơn anh rất nhiều.
Câu lệnh On Error Resume Next nghĩa là "gặp lỗi thì bỏ qua để thực hiện lệnh kế tiếp". Còn câu lệnh sArray = .Value được nằm trong câu lệnh With Range("A1:C10000") nên có thể hiểu là "gán giá trị của vùng A1:C10000 vào cho mảng sArray"
 
Upvote 0
Thật sự gặp người giỏi thì tôn làm sư phụ cũng chẳng nhục tí nào....người khôn là người biết đưa cái dốt ra để sao này đỡ dốt hơn....ihihihihi
Cảm ơn anh Nghĩa Phúc đóng góp ý kiến dùm em....
 
Upvote 0
If sArray(lR, 1) <> "" Then
tmpVal
= CDbl(sArray(lR, 1))
là ý nghĩa gì Anh giải thích dùm em nhé, thanks
 
Upvote 0
If sArray(lR, 1) <> "" Then
tmpVal
= CDbl(sArray(lR, 1))
là ý nghĩa gì Anh giải thích dùm em nhé, thanks
Tức là nếu phần tử (lR, 1) của mảng sArray khác rỗng thì biến tmpVal = giá trị của phần tử thứ (lR, 1) có trong mảng. Hàm CDbl dùng để chuyển đổi giá trị đó sang kiểu double.
 
Upvote 0
Nếu giá trị tmpval là biến tại sao dòng gần cuối
anh Duyệt lại viết
sarry(lr,2)=tmp
là bò mất Val vậy anh,vậy tmp là lệnh gì vậy
thanks anh nhiều...
 
Upvote 0
Nếu giá trị tmpval là biến tại sao dòng gần cuối
anh Duyệt lại viết
sarry(lr,2)=tmp
là bò mất Val vậy anh,vậy tmp là lệnh gì vậy
thanks anh nhiều...
tmp cũng là biến double luôn bạn. Bạn để ý kĩ trên Dim có khai báo tmp as double mà. Bạn để ý chỗ này
PHP:
         If tmpVal < sArray(lR, 3) Then
            Do Until tmpVal * n > sArray(lR, 3)
              tmp = tmpVal * n
              n = n + 0.1
            Loop
            sArray(lR, 2) = tmp
          Else
            sArray(lR, 2) = tmpVal
          End If
Nếu điều kiện thỏa thì gán phần tử thứ (lR,2) của mảng là tmp, còn ngược lại thì gán tmpVal. Hai biến này là khác nhau chứ không phải lệnh gì đâu bạn.
 
Upvote 0
Nếu giá trị tmpval là biến tại sao dòng gần cuối
anh Duyệt lại viết
sarry(lr,2)=tmp
là bò mất Val vậy anh,vậy tmp là lệnh gì vậy
thanks anh nhiều...
Qua vài câu hỏi thì có vẽ như bạn chưa biết tí gì về VBA cả... vậy sao mà viết code được đây?
Thôi thì học từ cơ bản đi bạn à? Tắt ngang thế không ổn đâu!
----------------
Ủa mà sao bạn lại nghĩ tôi là TẢ QUÂN vậy trời? +-+-+-+
 
Upvote 0
Dạ em cũng muốn học từ cơ bản đi lên, mà không biết học ngôn ngữ gì vì lập trình quá nhiều ngôn ngữ,mong thầy Duyệt và các anh diễn đàn chỉ dùm con đường chánh đạo học từ cơ bản cái vba này với, phải bắt đầu học ngôn ngữ gì và học ở đâu để được cái cơ bản môn này.Thanks các vị tiền bối sư huynh nhiều....

Sao thầy Duyệt không mở lại lớp VbA để dạy cho đàn em học cho mở rộng kiến thức,hình như năm 2006 thầy có mở lớp mà giờ sao không mở nữa....Nếu có mở chỗ khác thầy thông báo để các thành viên diễn đàn có điều kiện học tốt hơn ....
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Sao thầy Duyệt không mở lại lớp VbA để dạy cho đàn em học cho mở rộng kiến thức,hình như năm 2006 thầy có mở lớp mà giờ sao không mở nữa....Nếu có mở chỗ khác thầy thông báo để các thành viên diễn đàn có điều kiện học tốt hơn ....
Spam một tí: Hỏi lại cho rõ nhé, bạn đang nói đến thầy Duyệt là ai vậy? Nãy giờ đâu thấy thầy Duyệt nào lên tiếng ở đây đâu nhỉ?
 
Upvote 0
Hỏi cho rõ nha, bạn đang nói đến thầy Duyệt là ai vậy? Nãy giờ đâu thấy thầy Duyệt nào lên tiếng ở đây đâu nhỉ?

/-)ó là Tả quân Lê Văn Duyệt nhà ta, như NDU đã nêu trên.

Trước đây Tả quân Ta có lên lớp 5 bài về VBA; số bài giảng này vẫn còn bút tích tại WEBKETOAN.COM hay sao í!

Dạo này Hội trưởng nhà ta Fiêu lưu đâu rồi không biết nữa?
 
Upvote 0
Tả Quân Ta thì em không hiểu thầy lấy bút tích do đâu chứ tên Lê Văn Duyệt thì trang web kế toán nào em cũng thấy....
Mấy bài thầy Duyệt dạy từ năm 2006...tại số 10 -Bàu Cát mà sao đến giờ không thấy mở nữa....Thầy Duyệt cho ý kiến để mọi người biết nhé....
 
Upvote 0
Thật sự gặp người giỏi thì tôn làm sư phụ cũng chẳng nhục tí nào....người khôn là người biết đưa cái dốt ra để sao này đỡ dốt hơn....ihihihihi
Cảm ơn anh Nghĩa Phúc đóng góp ý kiến dùm em....

ah ha, tôi thích cậu em này, "thà vát nặng 1 cây bút, còn hơn vác nặng thanh sắc" . Năm xưa tôi học lóm nhờ ăn nằm ăn vạ trong Microsoft Forum và Ozgrid forum nên võ vẽ 1 xí . Chỉ học chơi thôi, thay vì chơi games, ta chơi Excel .
 
Upvote 0
Em thử sửa lại cho đơn giản hóa code đi mà thấy nó cũng chạy được.... em không hiểu khi nào cần dim và khi nào không cần dim biến,su phụ ndu9608163 và anh em giải thích dùm em nhé...
Thanks so much

em gửi lên lại bài em tự sửa....
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Em thử sửa lại cho đơn giản hóa code đi mà thấy nó cũng chạy được.... em không hiểu khi nào cần dim và khi nào không cần dim biến,su phụ ndu9608163 và anh em giải thích dùm em nhé...
Thanks so much
Bạn muốn Dim cũng được mà không Dim cũng được, đó gọi là khai báo biến, nếu bạn khai báo biến, bạn có thể khai báo được các kiểu cho phù hợp và cũng đỡ tốn tài nguyên, còn không khai báo thì mọi chuyện sẽ được quy thành Variant.
Hơn nữa, khi khai báo biến, bạn có thể sử dụng kiểu khai báo cục bộ hay toàn cục, điều mà không khai báo thì không thể làm được.
Xa hơn nữa, khi bạn sử dụng khai báo biến kết hợp với Option Explicit sẽ giúp bạn tránh được các rắc rối đến từ việc gõ sai tên biến.
 
Upvote 0
Sub Test1() 'thu sua code module1 lai cho don gian'
Dim an As Double 'an xuat hien nhieu lan trong code nen khai bao dim cho no'
With Range("A1:C100")
sArray = .Value
For lR = 1 To UBound(sArray, 1) 'cho lR la so thu tu trong mang Sarray bat dau tu dong thu nhat'
n = 1 ' den gia tri cuoi cung cot dau tien cua mang A1:C100 - " to ubound(sarray,1)'
If sArray(lR, 1) <> "" Then ' neu gia tri dong nao cua cot dau tien ko chua gia tri - rong'
an = sArray(lR, 1) 'gan an bang gia tri trong cot A khi bien lR chay tu 1 den 100 cho nhung cho do'
If an < sArray(lR, 3) Then 'neu gia tri gan cot dau tien nho hon gia tri cot thu 3 cua mang-cot C'
Do Until an * n > sArray(lR, 3) 'cau truc lap vong "do until <dieukien> ....loop, lam den khi nao tmp>gtri cot 3-cot C'
'neu xoa dong "Do Until Val * n > sArray(lR, 3)" và dòng "Loop" di'
n = n + 0.1 'thi cau truc se ko lap vong, ket qua gia tri cot 2 = gia tri cot 1'
tmp = an * n ' tai moi dong bat dau n=1, no se lay gia tri n* gia tri cot dau tien og mang(an)'
Loop ' sao cho gtri nhan lon hon gia tri cot thu 3 cua mang (sarray(lR,3)'
sArray(lR, 2) = tmp ' neu ko thi n se tang dan len 0.1 de gia tri nay lon hon gtri cot thu ba cua mang'
' loop - la lap lai cach tinh cho moi dong den dong cuoi cung cua mang '
End If ' xong xuat gia tri ket qua nhan nay cho cot thu 2 cua mang '
End If ' chu y co bao nhieu "if" thi phai co bay nhieu "end if"

Next
.Value = sArray 'with...em with la de khai bao pham vi mang tinh toan'
End With
End Sub
em ko hiểu sao trong code này..các biến khác thì không cần khai báo, nhưng biến an ko khai báo thì chương trình bị lỗi,
có phải là do số lần xuất hiện của biến "an' nhiều lần trong code không anh,
giải thích dùm e m nhé....Thanks Anh nhiều

Sorry,lâu quá không gặp sư phụ, nhờ sư phụ chỉ giúp em bài trên nhé...
Thanks sư phụ nhiều....
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Nhờ sư phụ chỉ giúp em bài trên nhé...
Thanks sư phụ nhiều...
Code của bạn thế này:
PHP:
Dim tang(100)
Dim B As Integer, trung As Boolean, A As Integer
B = 0
For Each clls In vung
trung = True
For A = 0 To 100
If tang(A) = clls Then
trung = False
Exit For
End If
Next A

If trung = True Then
tang(B) = B + 1
End If
Next clls
demtang = B
Chẳng có TÊN HÀM hay TÊN SUB gì cả, lấy đâu mà chạy
Hơn nữa, đọc code tôi cũng chẳng hiểu bạn muốn gì
Hay là bạn mô tả ý định của bạn, tôi sẽ viết theo
 
Upvote 0
Ý em là dùng biến boolean để tìm giá trị có giá trị giống nhau trong mảng trong từng ô clls
Mặc định ban đầu mảng = 0
Nếu giá trị trong mảng có thì đếm lên ( true của biến boolean)
Nếu giá trị lần lượt sau trùng với giá trị có rồi thì thoát khỏi vòng lặp không đếm cộng thêm
Ngược lại hàm nó sẽ cộng dồn lên dần và cho ra số lượng tầng ( không trùng lặp lại)
Giống như tìm dữ liệu không trùng lặp ma 2 dùng biến true, false của Boolean để tìm
Diễn giải như vậy, sư phụ giúp dùm em
Thanks sư phụ nhiều

function demtang(vung as range) as integer
Dim tang(100)
Dim B As Integer, trung As Boolean, A As Integer
B
= 0
For Each clls In vung
trung
= True
For A = 0 To 100
If tang(A) = clls Then
trung
= False
Exit For
End If
Next A

If trung = True Then
tang
(B) = B + 1
End
If
Next clls
demtang
= B
 
Upvote 0
Ý em là dùng biến boolean để tìm giá trị có giá trị giống nhau trong mảng trong từng ô clls
Mặc định ban đầu mảng = 0
Nếu giá trị trong mảng có thì đếm lên ( true của biến boolean)
Nếu giá trị lần lượt sau trùng với giá trị có rồi thì thoát khỏi vòng lặp không đếm cộng thêm
Ngược lại hàm nó sẽ cộng dồn lên dần và cho ra số lượng tầng ( không trùng lặp lại)
Giống như tìm dữ liệu không trùng lặp ma 2 dùng biến true, false của Boolean để tìm
Diễn giải như vậy, sư phụ giúp dùm em
Thanks sư phụ nhiều
Tốt nhất bạn đừng nói cái gì liên quan đên code cả (vì có nói tôi cũng không hiểu)
Giờ với dữ liệu bạn đang có, bạn chỉ cần nói muốn làm gì? Thế thôi là đủ
 
Upvote 0
Dạ em muốn tìm dữ liệu không trùng lập trong 1 cột.......
1.đếm số
2. show ra giá trị không trùng lặp

Thanks sư phụ....
 
Upvote 0
Dạ em muốn tìm dữ liệu không trùng lập trong 1 cột.......
1.đếm số
2. show ra giá trị không trùng lặp

Thanks sư phụ....

Tức là cái nào không trùng với bất cứ cái nào trong dữ liệu thì lấy ra? Hay là sao?
Nếu trích những cái không trùng với ai thì nó chỉ có 1, đếm số gì chứ?
Hay bạn muốn trích lọc duy nhất đây? Tức dù trùng hay không trùng cũng chỉ lấy một?
Nếu vẫn chưa đúng ý bạn, tốt nhất bạn ghi kết quả bạn muốn vào file luôn đi (mô tả gì mà khó hiểu quá)
 
Upvote 0
Dạ để em mô tả thành file cho sư phụ dễ đọc vậy
 

File đính kèm

Upvote 0
Dạ để em mô tả thành file cho sư phụ dễ đọc vậy
dùng cái code này thử xem
Public Sub LOC()
Dim Dic, I As Long, Temp
Temp = Sheet1.Range([E5], [E60000].End(xlUp)).Value
Set Dic = CreateObject("Scripting.Dictionary")
For I = 1 To UBound(Temp)
If Not Dic.Exists(Temp(I, 1)) Then
Dic.Add Temp(I, 1), ""
End If
Next
[H5].Resize(Dic.Count) = Application.WorksheetFunction.Transpose(Dic.keys)
End Sub

thêm cái này nữa
Sub filter()
Dim Colect As Collection, i As Long, Arr As Variant
Application.ScreenUpdating = False
On Error Resume Next
With Sheet1
.Range("h5:h65500").Clear
Arr = .Range("e5:e65500").Value
Set Colect = New Collection
For i = 1 To UBound(Arr, 1)
Colect.Add Arr(i, 1), Arr(i, 1)
Next
For i = 1 To Colect.Count
.Cells(i + 4, "h") = Colect(i)
Next
End With
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi, có thể rút ngắn đoạn Code này không
PHP:
ActiveSheet.Range("G12").Formula = "=MAX(C12-D12+E12-F12,0)"
ActiveSheet.Range("G14").Formula = "=MAX(C14-D14+E14-F14,0)"
ActiveSheet.Range("G20").Formula = "=MAX(C20-D20+E20-F20,0)"
...
Em xin cảm ơn!
 
Upvote 0
Cho em hỏi, có thể rút ngắn đoạn Code này không
PHP:
ActiveSheet.Range("G12").Formula = "=MAX(C12-D12+E12-F12,0)"
ActiveSheet.Range("G14").Formula = "=MAX(C14-D14+E14-F14,0)"
ActiveSheet.Range("G20").Formula = "=MAX(C20-D20+E20-F20,0)"
...
Em xin cảm ơn!
Không tuân theo quy luật khì khó rút ngắn, chỉ được
PHP:
With ActiveSheet
  .Range("G12").Formula = "=MAX(C12-D12+E12-F12,0)"
  .Range("G14").Formula = "=MAX(C14-D14+E14-F14,0)"
  .Range("G20").Formula = "=MAX(C20-D20+E20-F20,0)"
End With
 
Upvote 0
Không tuân theo quy luật khì khó rút ngắn, chỉ được
PHP:
With ActiveSheet
  .Range("G12").Formula = "=MAX(C12-D12+E12-F12,0)"
  .Range("G14").Formula = "=MAX(C14-D14+E14-F14,0)"
  .Range("G20").Formula = "=MAX(C20-D20+E20-F20,0)"
End With

Được chứ!
PHP:
With ActiveSheet
  Union(.[G12], .[G14], .[G20]).FormulaR1C1 = "=MAX(RC3-RC4+RC5-RC6,0)"
End With
 
Upvote 0
Cho em hỏi thêm!
PHP:
Range("A1").Copy range("C1")
Em chỉ muốn copy công thức của A1, chứ không muốn copy Format thì em phải thêm gì vào code?
Xin cảm ơn!
 
Upvote 0
Cho em hỏi thêm!
PHP:
Range("A1").Copy range("C1")
Em chỉ muốn copy công thức của A1, chứ không muốn copy Format thì em phải thêm gì vào code?
Xin cảm ơn!
Code này là copy tất cả (công thức, format..)
Nếu copy công thức không thôi:
PHP:
Range("A1").Copy
Range("C1").PasteSpecial xlPasteFormulas
Hay là tham khảo thêm hình thuộc tính khác
Copy.JPG
 
Lần chỉnh sửa cuối:
Upvote 0
Thầy cô & anh chị cho em hỏi
Giả sử em đang đứng ở Sheet1, em muốn Show lại tất cả dòng cột bị ẩn hoặc Filter của một số Sheet (vídụ: Sheet2, Sheet3) thì dùng câu lệnh gì?
Em cảm ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
Được chứ!
PHP:
With ActiveSheet
  Union(.[G12], .[G14], .[G20]).FormulaR1C1 = "=MAX(RC3-RC4+RC5-RC6,0)"
End With
Như anh ViecHoai đã nói, Bài này thực sự không có công thức tổng quát, em nghĩ là đúng.?!!! cách làm của anh ndu cũng chỉ rút gọn được ít dòng code thôi chứ không có thể dùng các dòng lập duyệt qua tự động.(nếu dữ liệu nhiều thì không thể liệt kê từng cột từng cột)
 
Upvote 0
Như anh ViecHoai đã nói, Bài này thực sự không có công thức tổng quát, em nghĩ là đúng.?!!! cách làm của anh ndu cũng chỉ rút gọn được ít dòng code thôi chứ không có thể dùng các dòng lập duyệt qua tự động.(nếu dữ liệu nhiều thì không thể liệt kê từng cột từng cột)
Nguyên tắc: Chỉ cần các cell chứa công thức có thể copy/paste qua lại với nhau là hoàn toàn có thể viết 1 code duy nhất
Trong thực tế, các cell mà ta dự định đặt công thức chúng phải có đặt điểm gì đó chứ (Chẳng hạn chúng đang là những cell rổng)... Vì thế hoàn toàn có thể sử dụng 1 giải pháp nào đó mà không cần phải vòng lập (ví dụ là SpecialCells)
 
Upvote 0
Bold dòng

Nhờ thầy cô & anh chị hướng dẫn, em muốn Bold các dòng dưới thì làm thế nào
PHP:
.Offset(.Rows.Count)(1, 3) = "Cong phat sinh"
.Offset(.Rows.Count)(2, 3) = "Hieu Truong"
Em làm thế này nó cự nự!
PHP:
.Offset(.Rows.Count)(1, 3) = "Cong phat sinh".Font.Bold
.Offset(.Rows.Count)(2, 3) = "Hieu Truong".Font.Bold
Cảm ơn!
 
Upvote 0
Bạn thử thế này coi :
PHP:
.Offset(.Rows.Count)(1, 3) = "Cong phat sinh"
.Offset(.Rows.Count)(1, 3).Font.Bold = true
.Offset(.Rows.Count)(2, 3) = "Hieu Truong" 
.Offset(.Rows.Count)(2, 3).Font.Bold = true
Vì bạn không viết chi tiết CODE nên mình sửa tạm thế
này, tự kết hợp cho ngắn nhé!
 
Upvote 0
Vì bạn không viết chi tiết CODE nên mình sửa tạm thế
này, tự kết hợp cho ngắn nhé!

PHP:
.Offset(.Rows.Count)(1, 5) = Evaluate("Sum(" & .Offset(, 4).Resize(, 1).Address & ")")
.Offset(.Rows.Count)(1, 6) = Evaluate("Sum(" & .Offset(, 5).Resize(, 1).Address & ")")
.Offset(.Rows.Count)(1, 7) = Evaluate("Sum(" & .Offset(, 6).Resize(, 1).Address & ")")
.Offset(.Rows.Count)(1, 8) = Evaluate("Sum(" & .Offset(, 7).Resize(, 1).Address & ")")
Muốn Bold các cells trên, thì có thể rút ngắn được không?
Cảm ơn
 
Upvote 0
PHP:
.Offset(.Rows.Count)(1, 5) = Evaluate("Sum(" & .Offset(, 4).Resize(, 1).Address & ")")
.Offset(.Rows.Count)(1, 6) = Evaluate("Sum(" & .Offset(, 5).Resize(, 1).Address & ")")
.Offset(.Rows.Count)(1, 7) = Evaluate("Sum(" & .Offset(, 6).Resize(, 1).Address & ")")
.Offset(.Rows.Count)(1, 8) = Evaluate("Sum(" & .Offset(, 7).Resize(, 1).Address & ")")
Muốn Bold các cells trên, thì có thể rút ngắn được không?
Cảm ơn
Bạn thử thay đoạn trên thành thế này :
PHP:
For i = 5 to 8
  .Offset(.Rows.Count)(1, i) = Evaluate("Sum(" & .Offset(, i-1).Resize(, 1).Address & ")")
  .Offset(.Rows.Count)(1, i).Font.Bold = True
Next
Vì bạn chỉ trích một đoạn nên tôi đành sửa vậy!
 
Lần chỉnh sửa cuối:
Upvote 0
Giúp câu lệnh xóa định dạng đóng khung (Bỏder)!

Thầy cô & anh chị giúp em câu lệnh xóa định dạng đóng khung!
PHP:
Sh2.Range("A11:J6000").ClearContents
    Sh2.Range("A11:J6000").ClearFormats
.ClearFormats là xóa toàn bộ Formats, em muốn xóa đóng khung, giữ lại các định dạng khác!
Em cảm ơn!
 
Upvote 0
Thầy cô & anh chị giúp em câu lệnh xóa định dạng đóng khung!
PHP:
Sh2.Range("A11:J6000").ClearContents
    Sh2.Range("A11:J6000").ClearFormats
.ClearFormats là xóa toàn bộ Formats, em muốn xóa đóng khung, giữ lại các định dạng khác!
Em cảm ơn!
Thực ra bạn record cũng được code mà bạn
PHP:
Sh2.Range("A11:J6000").Borders.LineStyle = xlNone
 
Upvote 0
Định vị bảng tính, để định dạng & Format!

Em có một bảng tính, (không cố định, có thể dịch chuyển lên xuống, trái phải)
Em Record Macro bằng cách, bẩm tổ hợp Ctrl+F tìm "I.", sau đó định dạng & Format bằng tay. Thực tế thì bảng tính kg cố định, em muốn Học cách định vị để định dạng và Format nó.
Em cảm ơn
 

File đính kèm

Upvote 0
Bạn muốn tìm "I." sau đó định dạng cả vùng phía dưới bằng CODE à??? Nếu vậy thì tôi thấy dữ liệu bạn cho chưa tổng quát, vì "I." xuất hiện một lần tạivị trí ta đã biết.
 
Upvote 0
Nói chung em muốn cách nào đó để định vị được nó, rồi ta định dạng & Format
Gợi ý bạn làm thử nhé, để tìm "I." bạn xem FIND METHOD có cả 1 topic viết về nó bạn search trên diễn đàn nhé, kết hợp với offset, còn
muốn tìm hiểu kiểu định dạng bạn có thể ghi Macro để xem.
 
Upvote 0
Nói chung em muốn cách nào đó để định vị được nó, rồi ta định dạng & Format
Dựa vào code này bạn có thể tùy biến nhé
PHP:
Sub Timkiem()
Dim Rng As Range
Set Rng = Sheet1.UsedRange.Find("I.", , , xlWhole)
If Not Rng Is Nothing Then
  MsgBox Rng.Address
End If
End Sub
 
Upvote 0
Dựa vào code này bạn có thể tùy biến nhé
PHP:
Sub Timkiem()
Dim Rng As Range
Set Rng = Sheet1.UsedRange.Find("I.", , , xlWhole)
If Not Rng Is Nothing Then
  MsgBox Rng.Address
End If
End Sub
Rồi sau đó mình tiếp tục định dạng và Format bảng tính như thế nào?, anh bấm "Sub Macro2()" là nó ra kết quả em muốn thực hiện!
Cảm ơn anh
 
Upvote 0
Rồi sau đó mình tiếp tục định dạng và Format bảng tính như thế nào?, anh bấm "Sub Macro2()" là nó ra kết quả em muốn thực hiện!
Cảm ơn anh
Bạn xem code này để phát triển thêm nhé
PHP:
Sub DinhDang()
Dim Rng As RangeSet Rng = Sheet1.UsedRange.Find("I.", , , xlWhole)
If Not Rng Is Nothing Then
   Rng.Resize(, Rng.CurrentRegion.Columns.Count).Font.Bold = True
  With Rng.CurrentRegion
    .Borders.Weight = xlThin
    With .Borders(xlInsideHorizontal)
       .LineStyle = xlContinuous
       .Weight = xlHairline
    End With
  End With
End If
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Trong 1 File có nhiều Sheet trong đó có các Sheet như T01, T02, T03 ...
Tại Sheet T02, em muốn lấy số liệu của Sheet T01, nhưng Sheet T01 có Auto Filter nên em muốn Sheet T01 ShowAllData trước khi em thực hiện, thì em phải đặt câu lệnh có cấn trúc như thế nào? để có thể áp dụng chung cho trường hợp "Tại Sheet hiện hành là Tn, em muốn ShowAllData của Sheet Tn-1"
Xin vui lòng giúp em. Cảm ơn!

Bài trên em có viết code như thế này, nhưng chưa được & báo lỗi
Mã:
Sub Thu()
Dim i As Long, Sheeti As Sheets
Sheets("Sheeti").Activate
Sheets("T" & Format(i - 1, "00")).ShowAllData
End Sub
Xin vui lòng sửa giúp em. Cảm ơn!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Trong 1 File có nhiều Sheet trong đó có các Sheet như T01, T02, T03 ...
Tại Sheet T02, em muốn lấy số liệu của Sheet T01, nhưng Sheet T01 có Auto Filter nên em muốn Sheet T01 ShowAllData trước khi em thực hiện, thì em phải đặt câu lệnh có cấn trúc như thế nào? để có thể áp dụng chung cho trường hợp "Tại Sheet hiện hành là Tn, em muốn ShowAllData của Sheet Tn-1"
Xin vui lòng giúp em. Cảm ơn!
Tại sao bạn không show hết nó lên 1 loạt rồi tiến hành lấy dữ liệu mà lại làm khó cho mình thế.
Trong code trên của bạn không bít i bằng bao nhiêu sao mà biết ta muốn showdata ở sheet nào???
 
Lần chỉnh sửa cuối:
Upvote 0
Tại sao bạn không show hết nó lên 1 loạt rồi tiến hành lấy dữ liệu mà lại làm khó cho mình thế.

Vì ngòai cái ShowAllData, em còn áp dụng cho cái khác!

Thầy cô & anh chị có thể giúp em bài #103 & #104, Không biết ý tưởng của em thực hiện được không? Nếu không thì vui lòng hồi âm cho em biết! Em cảm ơn!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
/(/gâm cứu macro dưới xem sao

Thầy cô & anh chị có thể giúp em bài #103 & #104, Không biết ý tưởng của em thực hiện được không? Nếu không thì vui lòng hồi âm cho em biết! Em cảm ơn!

Thực hiện AutoFilter 1 nữa số trang tính của bạn & chạy thử macro sau

PHP:
Option Explicit
Sub ShowAllDatas()
Dim Sh As Worksheet
 For Each Sh In ThisWorkbook.Worksheets
    If IsNumeric(Right(Sh.Name, 2)) Then
        MsgBox Sh.Name, , Sh.AutoFilterMode
    End If
 Next Sh
End Sub

(*) Bạn cần nghiên cứu nhiều hơn về bẫy lỗi trong VBA
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Thực hiện AutoFilter 1 nữa số trang tính của bạn & chạy thử macro sau
(*) Bạn cần nghiên cứu nhiều hơn về bẫy lỗi trong VBA
Sao em chạy code nó báo lỗi. Xin coi lại giùm em!
Trong File em đính kèm có đọan code em mày mò từ sáng đến giờ.
Code của em nó Show tất cả các Sheet Tn. Em muốn đang đứng ở Sheet T03 thì chỉ Show T02 thôi!
Em cảm ơn
 

File đính kèm

Upvote 0
Sao em chạy code nó báo lỗi. Xin coi lại giùm em!
Trong File em đính kèm có đọan code em mày mò từ sáng đến giờ.
Code của em nó Show tất cả các Sheet Tn. Em muốn đang đứng ở Sheet T03 thì chỉ Show T02 thôi!
Em cảm ơn
Bạn thử code này xem:
PHP:
Sub Thu()
On Error Resume Next
Sheets("T" & Format(Right(ActiveSheet.Name, 2) - 1, "00")).ShowAllData
End Sub
 
Upvote 0
Trong 1 File có nhiều Sheet trong đó có các Sheet như T01, T02, T03 ...
Tại Sheet T02, em muốn lấy số liệu của Sheet T01, nhưng Sheet T01 có Auto Filter nên em muốn Sheet T01 ShowAllData trước khi em thực hiện,
Lấy dữ liệu ở sheet khác thì liên quan gì đến tình trạng Filter của sheet đó? Chẳng lẽ nó đang Filter thì bạn không lấy dữ liệu được à?
 
Upvote 0
Lấy dữ liệu ở sheet khác thì liên quan gì đến tình trạng Filter của sheet đó? Chẳng lẽ nó đang Filter thì bạn không lấy dữ liệu được à?

Tại Sh T02, em lập code lấy số dư cuối kỳ của Sh T01, Mặt khác File thực tế của em có dung lượng khá lớn. Nếu T01 có ẩn dòng mà chạy code, nó treo máy luôn, và ngược lại
Em cảm ơn!
 
Upvote 0
Tại Sh T02, em lập code lấy số dư cuối kỳ của Sh T01, Mặt khác File thực tế của em có dung lượng khá lớn. Nếu T01 có ẩn dòng mà chạy code, nó treo máy luôn, và ngược lại
Em cảm ơn!

Vậy thì vấn đề nằm ở code của bạn... Dung lương chỉ là 1 phần ảnh hưởng đến tốc độ thôi, nếu code viết tốt, dung lương bao nhiêu cũng phải chạy.. vèo vèo
Việc bây giờ là phải xem lại toàn bộ giải thuật trong code chứ không phải đi giải quyết theo kiểu "cố chống"
 
Upvote 0
Nếu T01 có ẩn dòng mà chạy code, nó treo máy luôn, và ngược lại
treo máy không phải do AutoFilter, mà do chính code đang thực thi.
Bạn cho xem đoạn code chính của bạn đi. Nếu Code đúng chuẩn thì chẳng cần activate sheet, không cần xả Filter, không cần xả dòng cột ẩn, ... cũng lấy được dữ liệu.

Ghi chú:
1. Cần phải bẫy lỗi:
- Hoặc xét điều kiện nếu đang AutoFilter thì mớ xả ra, không thì thôi
- hoặc dùng câu lệnh xả AutoFilter khác như:

If Sh.AutoFilterMode = True Then Sh.Cells.AutoFilter

2. Bạn thực nghiệm xả AutoFilter, mà sheet thực nghiệm không dùng AutoFilter, chỉ ẩn dòng đơn thuần. MUốn thử nghiệm vũ khí mới thì phải tạo hiện trường giống thật mới thử được chứ?
 
Upvote 0
Bạn thử gửi file bạn test mà không được lên tôi xem sao.
Anh xem File đính kèm. Em cảm ơn !

Vậy thì vấn đề nằm ở code của bạn... Dung lương chỉ là 1 phần ảnh hưởng đến tốc độ thôi, nếu code viết tốt, dung lương bao nhiêu cũng phải chạy.. vèo vèo
Việc bây giờ là phải xem lại toàn bộ giải thuật trong code chứ không phải đi giải quyết theo kiểu "cố chống"

ptm0412 đã viết:
treo máy không phải do AutoFilter, mà do chính code đang thực thi.
Bạn cho xem đoạn code chính của bạn đi. Nếu Code đúng chuẩn thì chẳng cần activate sheet, không cần xả Filter, không cần xả dòng cột ẩn, ... cũng lấy được dữ liệu.

Ghi chú:
1. Cần phải bẫy lỗi:
- Hoặc xét điều kiện nếu đang AutoFilter thì mớ xả ra, không thì thôi
- hoặc dùng câu lệnh xả AutoFilter khác như:

If Sh.AutoFilterMode = True Then Sh.Cells.AutoFilter

2. Bạn thực nghiệm xả AutoFilter, mà sheet thực nghiệm không dùng AutoFilter, chỉ ẩn dòng đơn thuần. MUốn thử nghiệm vũ khí mới thì phải tạo hiện trường giống thật mới thử được chứ?
Em cảm ơn các thầy đã hướng dẫn, em sẽ xét lại code của em.

Bạn thử gửi file bạn test mà không được lên tôi xem sao.

A, em hiểu rồi, vì em nghỉ che dòng & cột nó giống như Filter, nên áp dụng code của các thầy cô không được.
Em cảm ơn thầy cô & anh chị đã giúp em.
Xin đừng la em nha!
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Các anh cho em hỏi muốn tạo một theard mới trong diễn đàn thì làm như thế nào ? Em cám ơn và xin lỗi chủ thớt vì nếu đặt câu hỏi không đúng chỗ. ^^
 
Upvote 0
A, em hiểu rồi, vì em nghỉ che dòng & cột nó giống như Filter, nên áp dụng code của các thầy cô không được.
Em cảm ơn thầy cô & anh chị đã giúp em.
Xin đừng la em nha!
Chính xác là chế ra súng ngắn cá nhân mà thử nghiệm vào xe tăng.
 
Upvote 0
Theo em, đôi khi hiện tại chưa được (hoặc chế ra chưa đúng), nhưng có thể trong tương lai thì vẫn có thể được Bác à.

Lê Văn Duyệt

Lúc đó sẽ gọi là "súng ngắn chống tăng", và thực nghiệm trên xe tăng mới đúng. Vấn đề là khi chế ra súng ngắn chống tăng thì lại thực nghiệm trên cây chuối.

Ý tôi muốn nói là đối tượng thực nghiệm phải đúng với mục đích thử nghiệm.
 
Upvote 0
Tại Sheet Tn, copy B1:B10 của Sheet Tn-1 và Paste Value vào A1: A10 của Sheet Tn

Trong 1 File có nhiều Sheet trong đó có các Sheet như T00, T01, T02, T03 ...

Tại Sheet T01, em muốn copy khối B1:B10 của Sheet T00, và Paste Value vào khối A1:A10 của Sheet T01
Em muốn có đọan code chung để có thể thực hiện ở các tình huống tương tự khác.

Xin vui lòng giúp em. Cảm ơn!​
 
Upvote 0
Câu lệnh thì thế này :
Sheets("T00").[B1:B10].value = sheets("T01").[A1:A10].value
Code chung là thế nào? Bạn có thể nói rõ được không? Bạn diễn tả chung chung quá!!!
 
Lần chỉnh sửa cuối:
Upvote 0
Câu lệnh thì thế này :
Sheets("T00").[A1:A10].value = sheets("T01").[B1:B10].value
Code chung là thế nào? Bạn có thể nói rõ được không? Bạn diễn tả chung chung quá!!!

Đoạn code chung có nghĩa là có thể áp dụng chung cho cả các Tên Sheet có cấu trúc Tn (Trong đó n là từ 00 đến 99). Như vậy nếu có code chung thì ta vẫn chạy được ở các Sheet khác, VD: Tại Sheet T99, em muốn copy khối B1:B10 của Sheet T98, và Paste Value vào khối A1:A10 của Sheet T99 (Nghĩa là mỗi lần chạy code ta không cần thay đổi tên Sheet nữa)
Thân!
 
Upvote 0
Đoạn code chung có nghĩa là có thể áp dụng chung cho cả các Tên Sheet có cấu trúc Tn (Trong đó n là từ 00 đến 99). Như vậy nếu có code chung thì ta vẫn chạy được ở các Sheet khác, VD: Tại Sheet T99, em muốn copy khối B1:B10 của Sheet T98, và Paste Value vào khối A1:A10 của Sheet T99 (Nghĩa là mỗi lần chạy code ta không cần thay đổi tên Sheet nữa)
Thân!
PHP:
Sub copy()
With ActiveSheet
.[B1:B10].Value = Sheets("T" & Format(Right(.Name, 2) - 1, "00")).[A1:A10].Value
End With
End Sub
 
Upvote 0
Đoạn code chung có nghĩa là có thể áp dụng chung cho cả các Tên Sheet có cấu trúc Tn (Trong đó n là từ 00 đến 99). Như vậy nếu có code chung thì ta vẫn chạy được ở các Sheet khác, VD: Tại Sheet T99, em muốn copy khối B1:B10 của Sheet T98, và Paste Value vào khối A1:A10 của Sheet T99 (Nghĩa là mỗi lần chạy code ta không cần thay đổi tên Sheet nữa)
Thân!
Hổng biết khi "đứng" tại sheet T00 thì sẽ copy dữ liệu tại sheet nào nhỉ?
 
Upvote 0
Thì code sẽ báo lỗi và ta thêm điều kiện nếu đứng tại sheet T00 thì thoát SUB, ẸC ẸC....!
 
Upvote 0
Với những người lập trình chuyên nghiệp như anh NDU thì dùng On ERROR RESUME NEXT thì không vấn đề gì nhưng với những người mới viết CODE theo em nên hạn chế dùng cái đó, vì nhiều khi ta viết code bị lỗi (những lỗi nhỏ nên khắc phục) nhưng ta lại không biết nó lỗi ở đâu...
 
Upvote 0
Giúp em sửa lỗi đoạn code này
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Range("A9:A50") Then
Target.Offset(, 1) = Target.Value
End If
End Sub
Code bị lỗi dòng thứ 2. Em cảm ơn!
 
Upvote 0
Dòng thứ 2:

If Not Intersect(Target, Range("A9:A50")) Is Nothing Then
 
Upvote 0
Thầy cô và anh chị cho em hỏi 02 câu:
1/ Khi em mở 1 File thì muốn luôn luôn mặc định của bảng tính sẽ ở chế độ
Mã:
.Calculation = xlCalculationManual

Vì thực tế khi em mở 1 File AAA đã để chế độ này bằng Tools/Options/Caculation/Manual, và khi mở tiếp File BBB và nếu như File này ở chế độ Automatic thì File AAA sẽ chuyển về chế độ Automatic. Nên ý em muốn là như trên

2/ Do bảng tính luôn ở chế độ Manual, nên mỗi lần chọn "Số phiếu" tại Cell L5 (tại cell này sử dụng Validation) của Sheet "Phiếu Thu" (Sheet này tính toán bằng công thức) thì phải cập nhật lại bằng phím F9. Ý em muốn khi chọn số phiếu tại cell L5 thì sheet "Phiếu Thu" tự động cập nhật lại số liệu và sau đó trả về Manual.

Em cảm ơn
 
Upvote 0
Thầy cô và anh chị cho em hỏi 02 câu:
1/ Khi em mở 1 File thì muốn luôn luôn mặc định của bảng tính sẽ ở chế độ
Mã:
.Calculation = xlCalculationManual

Vì thực tế khi em mở 1 File AAA đã để chế độ này bằng Tools/Options/Caculation/Manual, và khi mở tiếp File BBB và nếu như File này ở chế độ Automatic thì File AAA sẽ chuyển về chế độ Automatic. Nên ý em muốn là như trên

2/ Do bảng tính luôn ở chế độ Manual, nên mỗi lần chọn "Số phiếu" tại Cell L5 (tại cell này sử dụng Validation) của Sheet "Phiếu Thu" (Sheet này tính toán bằng công thức) thì phải cập nhật lại bằng phím F9. Ý em muốn khi chọn số phiếu tại cell L5 thì sheet "Phiếu Thu" tự động cập nhật lại số liệu và sau đó trả về Manual.

Em cảm ơn
1. Bạn đặt code trong sự kiện Private Sub Workbook_Open()
2. Bạn sử dụng lệnh Calculate là nó tính toán lại bảng tính (tương đương F9)
 
Upvote 0
1. Bạn đặt code trong sự kiện Private Sub Workbook_Open()
Em đặt code tại ThisWorkbook là như thế này
Mã:
Private Sub Workbook_Open()
Application.Calculation = xlCalculationManual
End Sub
2. Bạn sử dụng lệnh Calculate là nó tính toán lại bảng tính (tương đương F9)
Câu (2) em không biết sử dụng sự kiện này như thế nào
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
.........................................................................

Mong anh giúp em. Cảm ơn anh.
 
Upvote 0
Em đặt code tại ThisWorkbook là như thế này
Mã:
Private Sub Workbook_Open()
Application.Calculation = xlCalculationManual
End Sub

Câu (2) em không biết sử dụng sự kiện này như thế nào
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
.........................................................................

Mong anh giúp em. Cảm ơn anh.
Câu (2)
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
........Code của bạn.........................................................
Calculate
End Sub
 
Upvote 0
Như em nói ở trên, ở Sheet này em chỉ dùng công thức chứ không dùng code!
Vậy mấy bài vừa rồi bạn hỏi gì (câu 2)?. Có phải sheet "Phiếu Thu" bạn sử dụng công thức hết, bạn muốn khi Cell L5 thay đổi thì tính toán. Cụ thể bạn phải dùng code cho sheet này:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$L$5" Then
  Calculate
End If
End Sub
Hoặc nếu khác thì bạn đưa file mình thử xem
 
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....
 
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....Anh Viehoai trả lời giúp em với..
Bạn nhấn Alt + F8 xong rồi gõ tên sub vào ô Macro name sau đó lick vào Run. Hoặc bỏ chữ Private đi cho nó hiện lên luôn. Hoặc gán nó vào một nút lệnh,...
 
Upvote 0

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

Back
Top Bottom