Những câu hỏi về code, xin giải thích các code, đề nghị các bạn gửi vào đây

Liên hệ QC
Status
Không mở trả lời sau này.

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

BQT

----------------------------------------------------------------------------------------------------------------


Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

Cám ơn các anh chỉ giáo
 
Chỉnh sửa lần cuối bởi điều hành viên:
Giai thích hộ em đoạn code nay với

PHP:
Public Function WriteHeaderFileDBF(FileInput As String)
        Dim i As Long
        Put #FileNumber, , Header.DBT '3'
        Put #FileNumber, , Header.YY '109'
        Put #FileNumber, , Header.MM '9'
        Put #FileNumber, , Header.DD '6'
        Put #FileNumber, , Header.NumRecords 'So luong ban ghi'
        Put #FileNumber, , Header.HeaderLen '257'
        Put #FileNumber, , Header.RecordLen '604'
        Put #FileNumber, , Header.NotUse 'Null'
        For i = 1 To NumFields '7
            Put #FileNumber, , Fields(i).FieldName
            Put #FileNumber, , Fields(i).FieldType
            Put #FileNumber, , Fields(i).FieldMemoAdd
            Put #FileNumber, , Fields(i).FieldWidth
            Put #FileNumber, , Fields(i).FieldDecimal
            Put #FileNumber, , Fields(i).NotUse
        Next i
End Function
Mã:
[B]Public Function WriteRecordsFileDBF(FileInput As String)[/B]
    Put #FileNumber, Header.HeaderLen, Header.EndHeader
    Records.DeleteFlag = 32
        With Parcels(i)
            Records.FieldParcelId = .Parcel
            Records.FieldUserName = .UserName
            Records.FieldCodeLandType = .LandType
            Records.FieldArea = .Area
            Records.FieldArea2 = .Area2
            Records.FieldAddress = .Address
            Records.FieldMDSD2003 = .MDSD2003
        End With
        Put #FileNumber, , Records.DeleteFlag
        Put #FileNumber, , Records.FieldParcelId
        Put #FileNumber, , Records.FieldArea
        Put #FileNumber, , Records.FieldArea2
        Put #FileNumber, , Records.FieldUserName
        Put #FileNumber, , Records.FieldCodeLandType
        Put #FileNumber, , Records.FieldAddress
        Put #FileNumber, , Records.FieldMDSD2003
[B]End Function[/B]

PHP:
Public Function ReadHeaderFileDBF(FileInput As String)
    Dim i As Long
    FileNumber = FreeFile
    Open FileInput For Binary As #FileNumber
        Get #FileNumber, , Header.DBT
        Get #FileNumber, , Header.YY
        Get #FileNumber, , Header.MM
        Get #FileNumber, , Header.DD
        Get #FileNumber, , Header.NumRecords
        Get #FileNumber, , Header.HeaderLen
        Get #FileNumber, , Header.RecordLen
        Get #FileNumber, , Header.NotUse
        NumFields = (Header.HeaderLen - 32 - 1) / 32
        ReDim Fields(NumFields) As FieldStructure
        For i = 1 To NumFields
            Get #FileNumber, , Fields(i).FieldName
            Get #FileNumber, , Fields(i).FieldType
            Get #FileNumber, , Fields(i).FieldMemoAdd
            Get #FileNumber, , Fields(i).FieldWidth
            Get #FileNumber, , Fields(i).FieldDecimal
            Get #FileNumber, , Fields(i).NotUse
        Next i
    Close #FileNumber
End Function
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Nếu dữ liệu của bạn < 65.000 dòng thì hai đoạn code trên là tương đương.
Khi dữ liệu >=65.000 dòng thì Khác biệt sẽ thấy rõ đấy bạn à! Bạn hãy thử với hai đoạn code sau (chép vào sheet, không chép vào module), rồi cho chạy SUB này để thấy sự khác biệt.
PHP:
Sub Test()
a = Cells(Cells.Rows.Count, 1).End(xlUp).Row
b = [A65000].End(xlUp).Row
MsgBox a
MsgBox b
End Sub

Nhờ giải thích giúp trong đoạn code trên thì (xlUp) màu đỏ trong ngoặc có nghĩa là sao?+-+-+-+
 
Upvote 0
chao các bác các bác giải đáp dùm em cái này nhé.em muốn đưa một file có dạng *txt vào ex làm thế nào nhỉ.các bác viết code và cho một ví dụ nhé
 
Upvote 0
Cho biết chổ sai trong hàm tự tạo sau:

Do mới vào nên không biết post bài có đúng chố không , nếu sai BQT chuyển dùm
Nhờ BQT chỉ cho chỗ sai trong đoạn code dưới đây

PHP:
Function FindSp(Mang As Range, Diem As Range) As Long
 For i = 1 To 3
     If fn.Find(Mang.Offset(i, 0), Diem) > 0 Then
            FindSp = Find(Mang.Offset(i, 0), Diem)
           Exit For
 Next
End Function

Xin cảm ơn BQT

Ko ai giúp đỡ new member sao??? Việc này rất gấp mong các bạn Pro về code hướng dẫn tôi với.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Đoạn code để chèn ảnh

Nhờ các bro giúp đỡ đoạn code này. Đoạn này dùng để quản lý nhân viên có hình ảnh: ví dụ: Khi gõ tên người thư1 ==> ảnh người thứ 1 v..v.... Đoạn code này được lấy từ bài:
http://www.giaiphapexcel.com/forum/showthread.php?t=18652
Tôi ko biết về code nên mong các bạn chỉ giúp

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Rng As Range, PicName As String
  Application.ScreenUpdating = False
  On Error Resume Next
  If Not Intersect([A3:A10], Target) Is Nothing Then
    Set Rng = Sheet2.Range("A2").CurrentRegion
    PicName = ThisWorkbook.Path & "\" & Rng.Find(Target).Offset(, 4)
    Sheet1.Shapes(Target.Offset(, 4).Address).Delete
    With ActiveSheet.Pictures.Insert(PicName)
     .Name = Target.Offset(, 4).Address
     .Left = Target.Offset(, 4).Left: .Top = Target.Offset(, 4).Top
     .Width = Target.Offset(, 4).Width: .Height = Target.Offset(, 4).Height
   End With
  End If
End Sub
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Do mới vào nên không biết post bài có đúng chố không , nếu sai BQT chuyển dùm
Nhờ BQT chỉ cho chỗ sai trong đoạn code dưới đây

Mã:
Function FindSp(Mang As Range, Diem As Range) As Long
 For i = 1 To 3
     If [COLOR="Red"]fn[/COLOR].Find(Mang.Offset(i, 0), Diem) > 0 Then
            FindSp = Find(Mang.Offset(i, 0), Diem)
           Exit For
 Next
End Function

Xin cảm ơn BQT

(1) Thiếu câu lệnh End If
(2) fn phải được chỉ ra rõ ràng, như Range("A1:D35")
(3) Câu lệnh
Mã:
FindSp = Find(Mang.Offset(i, 0), Diem)
Sai hai chổ, đó là:
(+) Phương thức FIND() phải chỉ rõ nơi phải tìm, Bắt buộc phải như là
Range("A1:B65500").FIND(. . . , . . .)
(+) FindSP được khai báo có kiểu dữ liệu là Long; Còn phương thức tìm kiếm trả về là biến đối tượng; mà cụ thể có kiểu dữ liệu Range
Câu lệnh đó có thể phải sửa lại gần giống như thế này

PHP:
FindSp = Columns(35).Find(Mang.Offset(i, 0), Diem).value
(Nhưng có thể vẫn báo lỗi, một khi phương thức không tìm thấy cái cần tìm trong vùng quy định cho nó.)
(4) Câu lệnh: If fn.Find(Mang.Offset(i, 0), Diem) > 0 Then
Phải sửa lại như (3), hay
PHP:
  If Not fn.Find(Mang.Offset(i, 0), Diem)  Is Nothing Then
                . . . . .


Nói chung bạn nên khai báo các biến đầy đủ;
Luôn nên dùng câu lệnh Option Explicit trên các Sub cũng như các Function
Đó là lời mình luôn khuyên những người đang chập chững đến với VBA! Bạn có dận cũng đành chịu!
 
Upvote 0
Nhờ các bro giúp đỡ đoạn code này. Đoạn này dùng để quản lý nhân viên có hình ảnh: ví dụ: Khi gõ tên người thư1 ==> ảnh người thứ 1 v..v.... Đoạn code này được lấy từ bài:
http://www.giaiphapexcel.com/forum/showthread.php?t=18652
Tôi ko biết về code nên mong các bạn chỉ giúp

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Rng As Range, PicName As String
  Application.ScreenUpdating = False
  On Error Resume Next
  If Not Intersect([A3:A10], Target) Is Nothing Then
    Set Rng = Sheet2.Range("A2").CurrentRegion
    PicName = ThisWorkbook.Path & "\" & Rng.Find(Target).Offset(, 4)
    Sheet1.Shapes(Target.Offset(, 4).Address).Delete
    With ActiveSheet.Pictures.Insert(PicName)
     .Name = Target.Offset(, 4).Address
     .Left = Target.Offset(, 4).Left: .Top = Target.Offset(, 4).Top
     .Width = Target.Offset(, 4).Width: .Height = Target.Offset(, 4).Height
   End With
  End If
End Sub


Đoạn ý mình muốn hỏi về đoạn code này. Mong mọi người giúp đỡ
 
Upvote 0
Cảm ơn bác "SA_DQ" Nhờ các Pro code giúp đỡ code sau

(1) Thiếu câu lệnh End If
(2) fn phải được chỉ ra rõ ràng, như Range("A1:D35")
(3) Câu lệnh
Mã:
FindSp = Find(Mang.Offset(i, 0), Diem)
Sai hai chổ, đó là:
(+) Phương thức FIND() phải chỉ rõ nơi phải tìm, Bắt buộc phải như là
Range("A1:B65500").FIND(. . . , . . .)
(+) FindSP được khai báo có kiểu dữ liệu là Long; Còn phương thức tìm kiếm trả về là biến đối tượng; mà cụ thể có kiểu dữ liệu Range
Câu lệnh đó có thể phải sửa lại gần giống như thế này

PHP:
FindSp = Columns(35).Find(Mang.Offset(i, 0), Diem).value
(Nhưng có thể vẫn báo lỗi, một khi phương thức không tìm thấy cái cần tìm trong vùng quy định cho nó.)
(4) Câu lệnh: If fn.Find(Mang.Offset(i, 0), Diem) > 0 Then
Phải sửa lại như (3), hay
PHP:
  If Not fn.Find(Mang.Offset(i, 0), Diem)  Is Nothing Then
                . . . . .


Nói chung bạn nên khai báo các biến đầy đủ;
Luôn nên dùng câu lệnh Option Explicit trên các Sub cũng như các Function
Đó là lời mình luôn khuyên những người đang chập chững đến với VBA! Bạn có dận cũng đành chịu!


Cảm ơn bác , em đã thử lại nhưng vẫn sai vì mới tập tẹ nên mong bác và các cao thủ về code giúp em hàm tự tạo , em có gửi File đính kèm

Mong được giúp đỡ .
Cảm ơn các Pro và BQTView attachment Nho_BQT_giupcode.xls
 
Upvote 0
Cảm ơn bác , em đã thử lại nhưng vẫn sai vì mới tập tẹ nên mong bác và các cao thủ về code giúp em hàm tự tạo , em có gửi File đính kèm

Mong được giúp đỡ .
Cảm ơn các Pro và BQTView attachment 30299
Dùng UDF này xem
PHP:
Function MatchX(L_Value As Range, L_Array As Range)
  Dim i As Long
  For i = 1 To L_Array.Resize(, 1).Count
    If Not L_Value.Find(L_Array(i, 1), LookAt:=xlPart) Is Nothing Then
      MatchX = i: Exit Function
    End If
  Next
End Function
 

File đính kèm

  • MatchX.xls
    20.5 KB · Đọc: 20
Upvote 0
Cảm ơn bác nhưng em còn thắc mắc 1 chút

Dùng UDF này xem
PHP:
Function MatchX(L_Value As Range, L_Array As Range)
  Dim i As Long
  For i = 1 To L_Array.Resize(, 1).Count
    If Not L_Value.Find(L_Array(i, 1), LookAt:=xlPart) Is Nothing Then
      MatchX = i: Exit Function
    End If
  Next
End Function


Do giá trị trả về có thể là số , có thể là ký tự , mà trong code của bác chỉ trả về phần tử thứ n trong mảng , vậy có cách nào để giá trị trả về của hàm MatchX linh hoạt hơn không . Rất cảm ơn
 
Upvote 0
Do giá trị trả về có thể là số , có thể là ký tự , mà trong code của bác chỉ trả về phần tử thứ n trong mảng , vậy có cách nào để giá trị trả về của hàm MatchX linh hoạt hơn không . Rất cảm ơn
Vậy ý bạn muốn trả về kết quả gì? Cứ ghi rõ vào file luôn rồi gữi lên nhé (vì câu hỏi trước bạn yêu cầu thế mà)
Nếu muốn kết quả trả về là giá trị thì chỉ cần thay:
MatchX = i: Exit Function
thành:
MatchX = L_Array(i, 1): Exit Function
 
Upvote 0
Thêm 1 cách nữa cho vui cửa vui nhà!

PHP:
Option Explicit
Function PartFind(FindValue As String, FindRange As Range)
 Dim Clls As Range
 
 For Each Clls In FindRange
   If InStr(FindValue, Clls.Value) > 0 Then
      PartFind = Clls.Offset(, -1):          Exit Function
   End If
 Next Clls
End Function
--=0 :-= --=0
 
Upvote 0
PHP:
Option Explicit
Function PartFind(FindValue As String, FindRange As Range)
 Dim Clls As Range
 
 For Each Clls In FindRange
   If InStr(FindValue, Clls.Value) > 0 Then
      PartFind = Clls.Offset(, -1):          Exit Function
   End If
 Next Clls
End Function
--=0 :-= --=0
Anh ơi, bài này người ta đang hỏi về Find cơ mà (em đoán vậy)
Hơn nữa Clls.Offset(, -1) em thấy không ổn ---> Sao có thể biết chắc FindRange nằm cạnh FindValue?
Có chăng, nếu dùng InStr em nghĩ phải vầy:
PHP:
Function PartFind(FindValue As String, FindRange As Range)
 Dim i As Long
 For i = 1 To FindRange.Resize(, 1).Count
   If InStr(UCase(FindValue), UCase(FindRange(i))) > 0 Then
     PartFind = FindRange(i, 1):          Exit Function
   End If
 Next i
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Trong VBA câu lệnh tương đương với bấm phím Ctrl + Shift + mũi tên xuống thì mình đã biết nhưng không biết có hay không câu lệnh tương đương với bấm phím Shift + mũi tên xuống, nếu có thể viết được các Bạn viết giúp mình nhé. Thanks!
 
Upvote 0
Trong VBA câu lệnh tương đương với bấm phím Ctrl + Shift + mũi tên xuống thì mình đã biết nhưng không biết có hay không câu lệnh tương đương với bấm phím Shift + mũi tên xuống, nếu có thể viết được các Bạn viết giúp mình nhé. Thanks!
Shift + Mũi tên xuống là chọn thêm 1 dòng bên dưới hả bác. Bác xem phải như thế này không?
PHP:
Selection.Resize(Selection.Rows.Count + 1).Select
 
Upvote 0
Tôi đoán chắc anh Trungchinh cần cái này thì đúng hơn:
PHP:
With Selection
  Range(.Cells, .End(xlDown)).Select
End With
Tương đương với Ctrl + Shift + mũi tên xuống... chứ lý nào lại lại Shift + mũi tên xuống (chỉ thêm có 1 dòng)


From Minh Nguyệt:

Anh ndu xem lại câu hỏi của anh TrungChinh nhé vì cái cần là Shift+mũi tên xuống còn Ctrl+Shift+mũi tên xuống thì đã biết
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Cảm ơn các bạn đã giúp nhưng chưa có phương án nào đạt yêu cầu. Tôi đã bổ sung file ví dụ và làm rõ lý do tại sao tôi muốn thế. Rất mong các bạn vui lòng giúp đỡ và có thể dùng cách khác miễn là đạt được yêu cầu. Thanks!
 

File đính kèm

  • Timdongan.xls
    21 KB · Đọc: 20
Upvote 0
Ai chà... lý ra anh phải nói trước là trong vùng dử liệu có dòng ẩn!
Tạm thời dùng cách này đi:
PHP:
With Range("B5:B60000")
   Range(.Cells(1), Intersect(.Cells, .Offset(1)).SpecialCells(12)(1)).Select
End With
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn Ndu ! Code này đạt yêu cầu rồi nhưng tôi chưa biết cách làm thế nào để tuỳ biến Cells(1) tức là khi chạy code sẽ chọn Cells hiện hành và Cells kế tiếp (ô đầu của mảng kế tiếp).
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom