Chuyên đề giải đáp những thắc mắc về code VBA

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Tôi mở file lên thấy bình thường. Có lỗi gì đâu nhỉ???

muốn thấy lỗi ư ? để tôi giúp cho thấy
1/check như hình dưới đây

c73afb1281f4c3f1b220cd78a450121a.png

2/bấm nút tải file ở trên vài lần
3/mở cái file cuối cùng mới tải xuống
4/bấm nút Enable Editing

7a064d41a781d48e79eaf04c5246214a.png


thử xem =))
 
Upvote 0
muốn thấy lỗi ư ? để tôi giúp cho thấy
1/check như hình dưới đây

c73afb1281f4c3f1b220cd78a450121a.png

2/bấm nút tải file ở trên vài lần
3/mở cái file cuối cùng mới tải xuống
4/bấm nút Enable Editing

7a064d41a781d48e79eaf04c5246214a.png


thử xem =))

Excel 3 mục ấy thì tren máy tôi luôn luôn tick rồi. Nhưng mà không hiểu sao lúc mở lên lỗi...Sau save lại...mở lên Save lại... Rồi mở lên vài lần là nó chạy bình thường ah...
 
Upvote 0
Excel 3 mục ấy thì tren máy tôi luôn luôn tick rồi. Nhưng mà không hiểu sao lúc mở lên lỗi...Sau save lại...mở lên Save lại... Rồi mở lên vài lần là nó chạy bình thường ah...

ừ , bạn End code rồi thì nó cũng hết ở chế độ Protected View thì cũng hết lỗi thôi mà .
 
Upvote 0
muốn thấy lỗi ư ? để tôi giúp cho thấy
1/check như hình dưới đây

c73afb1281f4c3f1b220cd78a450121a.png

2/bấm nút tải file ở trên vài lần
3/mở cái file cuối cùng mới tải xuống
4/bấm nút Enable Editing

7a064d41a781d48e79eaf04c5246214a.png


thử xem =))
Có cách nào gửi file cho máy khác mà không bị lỗi vậy không anh
em cảm ơn anh ạ
 
Upvote 0
Xin chào các bạn trong diễn đàn,
Mình có đoạn code sau xin các cao thủ giải thích hộ
Private Sub SetText(Text as String, XPos As integer, YPos as integer)
Session.autECLPS.SetCursorPos XPos,YPos
Session.autECLPS.SendKeys Finestring(text)
End Sub

Đặc biệt "autoECLPS" và "autoECLOIA" là gì ạ?



Set ConnectionList= CreateObject("PCOMM.autECLConnList")
Set Session= CreateObject("PCOMM.autECLSession")
Set OperationInformationArea= CreateObject("PCOMM.autECLOIA")
 
Upvote 0
Nhờ AE hổ trợ! Mình có đoạn code sau, mình muốn copy từ Workbook 1 sheet Addition sang workbook 2 ở sheet Addition nhưng vẫn giữ lại dữ liệu cũ ở workbook 2 ở sheet Addition. Mình nó paste qua nhưng bị mất dữ liệu trước đó. Mới học VBA nên còn dốt quá.

Cám ơn cả nhà!

Sub Macro1thunghiem()
'
' Macro1thunghiem Macro
'


'
Rows("A3:AE20").Select
Selection.Copy
ChDir "D:\BAO CAO"
Workbooks.Open Filename:="D:\BAO CAO\BAO CAO TUAN.xlsx"
Range("A4:AE18").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
ActiveWorkbook.Save
ActiveWindow.Close
End Sub
 
Upvote 0
Nên đưa file giả lập lên diễn đàn, bạn à!
 
Upvote 0
Nên đưa file giả lập lên diễn đàn, bạn à!

Cám ơn Bạn: mình đã làm được rồi. Mình cho nó chung 1 Workbook luôn. Nhưng phát sinh vấn đề là các dòng ko có dữ liệu nó cung copy luôn.
Nhờ bạn kiểm tra giúp nhé!

Public Sub Copyprofile()
Dim dong As Long
dong = Sheet8.Range("E" & (Sheet8.Range("E65000").End(xlUp).Row)).Row - 1
Sheet13.Range("A" & (Sheet13.Range("E65000").End(3).Row + 1)).Resize(dong, 25).Value = Sheet8.Range("B2").Resize(dong, 25).Value
MsgBox "XUAT XONG"
End Sub
 
Upvote 0
. . Mình đã làm được rồi, cho nó chung 1 Workbook luôn. Nhưng phát sinh vấn đề là các dòng ko có dữ liệu nó cung copy luôn.
Nhờ bạn kiểm tra giúp nhé!

Public Sub Copyprofile()
Dim dong As Long
dong = Sheet8.Range("E" & (Sheet8.Range("E65000").End(xlUp).Row)).Row - 1
Sheet13.Range("A" & (Sheet13.Range("E65000").End(3).Row + 1)).Resize(dong, 25).Value = Sheet8.Range("B2").Resize(dong, 25).Value
MsgBox "XUAT XONG"
End Sub

Thì bạn thay vì xài .End(3) thì xài .End(xlDown) để copy từng đoạn có dữ liệu vậy; Thử nghiên cứu tiếp đi, đến khi mõi mết thì đưa file lên!

Chúc thành công!
 
Upvote 0
HIHI! Bác GIÚP GIÙM NHÉ.
CÁM ƠN BÁC!


Thế bạn muốn "Hiếp Tôi" cái gì đây?
1. Copy cả bảng hay chỉ copy mỗi dòng cuối cùng sang sheet kia?
2. Rồi copy dán qua sheet kia là dán đè lên hay là dán nối tiếp...

Hỏi bài mà kiểu đem con bỏ chợ "thế lày" thì biết đến bao giờ???
 
Upvote 0
HIHI! Bác GIÚP GIÙM NHÉ. CÁM ƠN BÁC!
PHP:
Option Explicit
Public Sub CopyProfile()
Dim Dong As Long, Cot As Byte
Dim Cls As Range
Sheet8.Select
Cot = [b1].CurrentRegion.Columns.Count
Dong = Range("E65000").End(xlUp).Row
For Each Cls In [E2].Resize(Dong)
    If Cls.Value <> "" Then
        Cells(Cls.Row, "B").Resize(, Cot).Copy Destination:=Sheet13.[B65500].End(xlUp).Offset(1)
    End If
Next Cls
MsgBox "XUAT XONG", , "GPE.COM"
End Sub
 
Upvote 0
Bạn nào có nhu cầu về việc truyền tham số thì có thể tham khảo file này
Tặng các bạn file chuẩn hóa dữ liệu từ sheet báo cáo bằng phương pháp truyền tham số ,Trong sheet Bao Cao có các cột A, B là cố đinh,Từ cột C đến Cột M có thể thêm bớt số của hàng, kết thúc các cột cửa hàng luôn luôn tới cột Grand Total. Tôi sẽ dựa vào cột Grand Total để tìm cột cửa hàng cuối cùng nhất mà lấy dữ liệu
Các cột còn lại là các cột Set chi tiết có thể thêm hoặc bớt nhiều cột Chi tiết set
Yêu cầu: Nếu dòng nào của các cột Set chi tiết có dữ liệu thì lấy qua database như mẫu
ở đây tôi viết 1 sub DataBase_01 có chứa tham số, và một sub main

sub DataBase_01 dung để dò dữ liệu trên từng cột Set chi tiết , sub main là để duyệt qua tất cả các cột Set chi tiết.
P/S nếu bạn nào quan tâm tới truyền tham số trong sub thì có thể xem, còn không thì thôi

Bạn cho hỏi là sao phải truyền tham số vậy bạn, và phải tách ra 2 sub ? Điều này có tác dụng gì???

Và tại sao không dùng trong 1 sub luôn cho gon...& không cần truyền tham số nhưng vẫn xác định được dòng cột nào muốn tách, muốn ghi dữ liệu...

=> Gôm vào 1 sub & không cần truyền tham số như bạn thì tốc độ sẽ cải thiện & tức thời hơn rất nhiều (nhanh hơn).

=========================
Giờ nâng độ khó lên tí:

Cũng với dữ liệu trên, chỉ cần 1 Mảng nguồn & 1 mảng đích, không hạn chế vòng lặp (nhưng làm sao cho nó ít nhất) & code để ra kết quả như trên sheet Database của bạn... & tất nhiên là viết trong 1 sub thôi!

Cùng tham gia nhé!

P/s: Vì thấy bài này cho cái dữ liệu thấy hay hay...@$@!^%@$@!^%@$@!^%
===========================================

Mã:
Public Sub GPE()
Dim Arr, dArr, I As Long, J As Long, K As Long, Col As Long, Z As Long
With Sheet2
    Arr = .UsedRange.Value
End With
Application.ScreenUpdating = False
For J = 1 To UBound(Arr, 2)
    If Arr(2, J) = "Grand Total" Then Col = J: Exit For
Next J
ReDim dArr(1 To UBound(Arr) * (UBound(Arr, 2) - Col), 1 To 5)
For I = 3 To UBound(Arr)
    For Z = Col + 1 To UBound(Arr, 2)
        If Arr(I, Z) <> Empty Then
            For J = 3 To Col - 1
            If Arr(I, J) <> Empty Then
                K = K + 1
                dArr(K, 1) = Arr(I, 1)
                dArr(K, 2) = Arr(I, 2)
                dArr(K, 3) = Arr(2, J)
                dArr(K, 4) = Arr(I, Z)
                dArr(K, 5) = Arr(I, J)
            End If
            Next J
        End If
    Next Z
Next I
With Sheet4
    .Range("A5").CurrentRegion.Offset(1).ClearContents
    If K Then
        .Range("A6").Resize(K, 4).NumberFormat = "@"
        .Range("A6").Resize(K, 5).Value = dArr
    End If
End With
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn cho hỏi là sao phải truyền tham số vậy bạn, và phải tách ra 2 sub ? Điều này có tác dụng gì???

Và tại sao không dùng trong 1 sub luôn cho gon...& không cần truyền tham số nhưng vẫn xác định được dòng cột nào muốn tách, muốn ghi dữ liệu...

=> Gôm vào 1 sub & không cần truyền tham số như bạn thì tốc độ sẽ cải thiện & tức thời hơn rất nhiều (nhanh hơn).

=========================
Giờ nâng độ khó lên tí:

Cũng với dữ liệu trên, chỉ cần 1 Mảng nguồn & 1 mảng đích, không hạn chế vòng lặp (nhưng làm sao cho nó ít nhất) & code để ra kết quả như trên sheet Database của bạn...

Cùng tham gia nhé!

P/s: Vì thấy bài này cho cái dữ liệu thấy hay hay...@$@!^%@$@!^%@$@!^%
Trong lập trình nếu muốn tối ưu cách viết và quản lý thì phải biết chia nhỏ các vấn đề ra để giải quyết, đó là cách tốt nhất. bạn có thể tham khảo trên các diễn đàn để biết. và chia nhỏ các vấn đề để trị có thể được gọi là đỉnh cao trong công việc lập trình

ví dụ như bạn muốn làm 10 cái bông hồng giống nhau nhưng khác nhau về màu sắc thì bạn làm như thế nào?
cách 1 cố làm ra 10 bông giống nhau từng cái riêng rẻ
cách 2 là tạo ra 1 cái khuôn, muốn màu nào thì đổ màu đó ra

nhận xét
cách 1 là cách dễ sai sót nhất. bạn có dám chắc là 10 cái bông đó giống y chang không? và có chắc là đã kiểm soát được không?
cách 2 nếu bị sai thì sẽ sai hàng loạt vì vậy dễ phát hiện và chắc chắn kiểm soát được 100%

cách 1. có cùng 1 công việc mà lập đi lập lại nhiều lần tạo ra nhiều bông
cách 2. chỉ cần đổ nguyên liệu vào khuôn thì ok ngay
nếu tạo 1 bông thì có thể cách 1 nhanh hơn
nếu càng nhiều bông thì cách 1 chuối hơn cách 2 nhiều
 
Upvote 0
PHP:
option explicit
public sub copyprofile()
dim dong as long, cot as byte
dim cls as range
sheet8.select
cot = [b1].currentregion.columns.count
dong = range("e65000").end(xlup).row
for each cls in [e2].resize(dong)
    if cls.value <> "" then
        cells(cls.row, "b").resize(, cot).copy destination:=sheet13.[b65500].end(xlup).offset(1)
    end if
next cls
msgbox "xuat xong", , "gpe.com"
end sub

sao nó ko copy value mà nó copy cả công thức vậy bạn? Cách chạy thì đúng rồi
 
Upvote 0
Web KT
Back
Top Bottom