Chuyên đề giải đáp những thắc mắc về code VBA (2 người xem)

Liên hệ QC

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

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:
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!
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 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
Các anh chị cho em hỏi:

Bây giờ em có 1 file excel, 1 sheet bao gồm dữ liệu gồm danh sách các mã hàng..., bây giờ em lọc một phần dữ liệu rồi em muốn khi gửi cho 1 người thì người đấy không thể sử dụng lọc để show dữ liệu khác ra được, nhưng vẫn có thể nhập được dữ liệu ( có nghĩa là khóa chức năng lọc lại, không cho sử dụng lọc).

Có cách nào hay phải dùng code, mong các anh chị giúp đỡ!
 
Upvote 0
Các bác cho e hỏi chút ạ: E thấy m.n hay khai báo:
Dim i as Long
Dim j as Long
Dim g as Long
...
Vậy bây giờ khai báo thành Dim i,j,g as Long có ảnh hưởng gì ko ạ
 
Upvote 0
Các bác cho e hỏi chút ạ: E thấy m.n hay khai báo:
Dim i as Long
Dim j as Long
Dim g as Long
...
Vậy bây giờ khai báo thành Dim i,j,g as Long có ảnh hưởng gì ko ạ

Ví dụ khi ta chỉ khai báo là Dim a ( khai báo kiểu mập mờ ) thì VBA sẽ mặc định kiểu dữ liệu của biến a là Variant

Suy ra:

Nếu bạn khai báo như ở trên thì chỉ có g được khai báo với kiểu dữ liệu là Long thôi còn i, j mặc định sẽ là Variant
 
Upvote 0
Ví dụ khi ta chỉ khai báo là Dim a ( khai báo kiểu mập mờ ) thì VBA sẽ mặc định kiểu dữ liệu của biến a là Variant

Suy ra:

Nếu bạn khai báo như ở trên thì chỉ có g được khai báo với kiểu dữ liệu là Long thôi còn i, j mặc định sẽ là Variant
E hiểu roài ạ, thank bác --=0
 
Upvote 0
Web KT

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

Back
Top Bottom