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:
Chào Anh Chi GPE
em có đoạn code bên dưới, muốn set trang vùng trang in, nhưng run code không chạy được.
Anh chi xem giúp em nhé.
Note: em chỉ muốn giới hạn vùng có dữ liệu thôi nhé. cám ơn anh chị
Mã:
Sub gioihanvungin()
With Sheets(1)
    .PageSetup.PrintArea = Range(Range("B65000").End(xlUp), Range("F1")).Select
End With
End Sub
 

File đính kèm

Upvote 0
Chào Anh Chi GPE
em có đoạn code bên dưới, muốn set trang vùng trang in, nhưng run code không chạy được.
Anh chi xem giúp em nhé.
Note: em chỉ muốn giới hạn vùng có dữ liệu thôi nhé. cám ơn anh chị
Mã:
Sub gioihanvungin()
With Sheets(1)
    .PageSetup.PrintArea = Range(Range("B65000").End(xlUp), Range("F1")).Select
End With
End Sub
Có một dòng thì mình viết liền luôn (tiết kiệm được những 2 dòng):
Mã:
Sheets(1).PageSetup.PrintArea = Range(Range("B65000").End(xlUp), Range("F1")).Select
'Code đúng hay chưa thì chưa xét'
 

File đính kèm

Upvote 0
Mã:
Sub gioihanvungin()
Dim lastRow As Long
With Sheets(1)
    lastRow = .Range("B65000").End(xlUp).Row
    .PageSetup.PrintArea = "$B$1:$F$" & lastRow
End With
End Sub
Có một dòng thì mình viết liền luôn (tiết kiệm được những 2 dòng):
Mã:
Sheets(1).PageSetup.PrintArea = Range(Range("F65000").End(xlUp), Range("F1")).Select
'Code đúng hay chưa thì chưa xét'
Chào befaint,
Mình thấy bạn lấy dòng cuối của cột F, có thể code giúp mình lấy cột cuối của cột B được không?
 
Lần chỉnh sửa cuối:
Upvote 0
Chào befaint,
Có thể code giúp mình set từ cột A qua Cột F được không?
Ý là cột B đó hả? --> Sửa lại thành:
PHP:
.PageSetup.PrintArea = "B1:F" & lastRow
'Với B1 là ô đầu tiên của cột đầu tiên thuộc vùng cần in'
'F_lastRow là ô cuối cùng của cột cuối cùng thuộc vùng cần in'
 
Upvote 0
Ý là cột B đó hả? --> Sửa lại thành:
PHP:
.PageSetup.PrintArea = "B1:F" & lastRow
'Với B1 là ô đầu tiên của cột đầu tiên thuộc vùng cần in'
'F_lastRow là ô cuối cùng của cột cuối cùng thuộc vùng cần in'

befaint lấy dòng cuối của cột B giúp mình nhé.
P/S: cột B có công thức chạy dài xuống.
 
Upvote 0
Thì mình đổi ký tự nào không phải là B thành B là được.
Mã:
lastRow = .Range("B65000").End(xlUp).Row
Mình đổi như bên trên, nhưng cột B của mình có công thức, nên dòng cuối sẽ lấy ô công thức cuối cùng, trong khi dữ liệu mình cần in nằm ở phía trên
 
Upvote 0
Mã:
lastRow = .Range("B65000").End(xlUp).Row
Mình đổi như bên trên, nhưng cột B của mình có công thức, nên dòng cuối sẽ lấy ô công thức cuối cùng, trong khi dữ liệu mình cần in nằm ở phía trên
Vậy sẽ có các cách:
- Dùng mảng duyệt các phần tử ở cột B (từ dưới lên), nếu có giá trị thì lấy từ dòng đó.
- Dùng ô phụ nào đó trong bảng tính để xác định dòng cuối cần in, dùng countif(), match(),max()...
Theo cách 2 cho đơn giản:
Công thức tại [Z1]:
Mã:
Z1=MAX($B$6:$B$9000)+5
Sub:
PHP:
Sub gioihanvungin()
Dim lastRow As Long
With Sheets(1)
    lastRow = .Range("Z1").Value
    .PageSetup.PrintArea = "B1:F" & lastRow
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy sẽ có các cách:
- Dùng mảng duyệt các phần tử ở cột B, nếu có giá trị thì lấy từ dòng đó.
- Dùng ô phụ nào đó trong bảng tính để xác định dòng cuối cần in, dùng countif(), match()...
mình hiểu rồi, code như bên dưới:
Chúc bạn ngủ ngon. cám ơn bạn rất nhiều
Mã:
Sub gioihanvungin()
Dim lastRow As Long
With Sheets(1)
    lastRow = .Range("A5") 'Dùng cột phụ hàm countif()
    .PageSetup.PrintArea = "B1:F" & lastRow
End With
End Sub
 
Upvote 0
Chào Anh Chi GPE
em có đoạn code bên dưới, muốn set trang vùng trang in, nhưng run code không chạy được.
Anh chi xem giúp em nhé.
Note: em chỉ muốn giới hạn vùng có dữ liệu thôi nhé. cám ơn anh chị
Mã:
Sub gioihanvungin()
With Sheets(1)
    .PageSetup.PrintArea = Range(Range("B65000").End(xlUp), Range("F1")).Select
End With
End Sub

Thuộc tính PrinArea trả về String nên bạn viết vậy không đúng cú pháp đâu.
Mã:
Property PrintArea As String
 
Upvote 0
Vậy sẽ có các cách:
- Dùng mảng duyệt các phần tử ở cột B (từ dưới lên), nếu có giá trị thì lấy từ dòng đó.
- Dùng ô phụ nào đó trong bảng tính để xác định dòng cuối cần in, dùng countif(), match(),max()...
Theo cách 2 cho đơn giản:
Công thức tại [Z1]:
PHP:
Sub gioihanvungin()
Dim lastRow As Long
With Sheets(1)
    lastRow = .Range("Z1").Value
    .PageSetup.PrintArea = "B1:F" & lastRow
End With
End Sub
Chào befaint,
Từ cdoe bên dưới mình muốn sort cột D va F theo chiều tăng dần thì sẽ code như thế nào, bạn giúp mình nhé. Cám ơn bạn nhiều.
Sub:
PHP:
Sub gioihanvungin()
Dim lastRow As Long
With Sheets(1)
    lastRow = .Range("Z1").Value
    .PageSetup.PrintArea = "B1:F" & lastRow
End With
End Sub
 
Upvote 0
Nếu bạn thích, bạn có thể dùng tinh năng Sort của Excel, để ghi lại Macro.
Mình dùng record macro nhưng khi bỏ ................vào thì phát sinh lỗi nên mình không sử sụng
PHP:
For i = 2 To 20
        If Sheets("Pickticket").Range("A" & i).Value <> Empty Then
            Sheets("Pickticket").Range("B" & i).copy
            Sheets("DN").Range("E6").PasteSpecial Paste:=xlPasteValues
            Application.CutCopyMode = False
            Dim lastRow As Long
    With Sheets("DN")
        lastRow = .Range("A10").Value
        .PageSetup.PrintArea = "C1:S" & lastRow
.............................
    End With
    With Sheets("DN").PageSetup
        .PrintTitleRows = "$10:$10"
    End With
        Sheets("DN").copy after:=Sheets("DN")
        End If
    Next i
 
Upvote 0
Mình dùng record macro nhưng khi bỏ ................vào thì phát sinh lỗi nên mình không sử sụng
Cứ ghi macro cái thao tác sort đi đã. Làm gì mà đã ghép mấy bài vô rồi.
Không dùng cái dòng nhiều chấm (......) đó, xóa nó đi vì nó đâu là code trong VBA (thêm dấu nháy đơn vào đầu dòng).

'-----
Tình hình hơi căng, chắc phải học lý thuyết trước thôi hoặc tìm người kèm.
 
Upvote 0
Xóa nội dung vì không phù hợp topic
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là toàn bộ code hiện tại mình có, bạn xem có đúng và có thể rút gọn giúp mình không !
Giờ có 2 phương án:
1- Nếu tiếp tục ở box này (Giải đáp thắc mắc...) thì chỉ gửi cái khúc sort lên trước (kèm thêm file cho mọi người dễ xem hơn thì càng tốt).
2- Lập một topic mới, nêu toàn bộ yêu cầu.
 
Upvote 0
Giờ có 2 phương án:
1- Nếu tiếp tục ở box này (Giải đáp thắc mắc...) thì chỉ gửi cái khúc sort lên trước (kèm thêm file cho mọi người dễ xem hơn thì càng tốt).
2- Lập một topic mới, nêu toàn bộ yêu cầu.
mình xin lỗi, mình quên đây là topic giải đáp thắc mắc.
Các Mod xóa giúp mình những bài không liên quan topic này nhé. cám ơn nhiều
 
Upvote 0
Các cao nhân cho em hỏi, giờ em có 1 vấn đề ntn
- em có 1 bảng (K9:X35), và đang cần điền dữ liệu bằng cách tham chiếu giá trị từ 1 dãy khác. Bảng K9:X35 sẽ được điền lần lượt từ trên xuống dưới (9 đến 35), rồi từ cột trái sang cột phải (K đến X), và giá trị sẽ nằm từ cột AN đến cột PA của dãy kia. Em đang định dùng 3 vòng lặp for cho i(dòng), j(cột) và k(cột tham chiếu), đang có code như sau
"
Dim i As Integer, j As Integer, k As Integer
For k = 40 To 417
For j = 11 To 24
For i = 9 To 35
Sheets("Laisuat").Cells(i, j).Value = Application.WorksheetFunction.VLookup(Ngay, Dulieu, k, False)
Next i
Next j
Next k"
*bảng K9:X35 ở sheet Laisuat, dãy tham chiếu là Dulieu.
Nếu thế này thì khi chạy macro tất cả các ô cần điền giá trị sẽ trả về giá trị ở cột cuối cùng của bảng tham chiếu (cột PA), giống nhau hết.
Có anh chị nào giúp em tìm ra code đúng với, xin cảm ơn nhiều ạ.
 
Upvote 0
Các cao nhân cho em hỏi, giờ em có 1 vấn đề ntn
- em có 1 bảng (K9:X35), và đang cần điền dữ liệu bằng cách tham chiếu giá trị từ 1 dãy khác. Bảng K9:X35 sẽ được điền lần lượt từ trên xuống dưới (9 đến 35), rồi từ cột trái sang cột phải (K đến X), và giá trị sẽ nằm từ cột AN đến cột PA của dãy kia. Em đang định dùng 3 vòng lặp for cho i(dòng), j(cột) và k(cột tham chiếu), đang có code như sau
"
Dim i As Integer, j As Integer, k As Integer
For k = 40 To 417
For j = 11 To 24
For i = 9 To 35
Sheets("Laisuat").Cells(i, j).Value = Application.WorksheetFunction.VLookup(Ngay, Dulieu, k, False)
Next i
Next j
Next k"
*bảng K9:X35 ở sheet Laisuat, dãy tham chiếu là Dulieu.
Nếu thế này thì khi chạy macro tất cả các ô cần điền giá trị sẽ trả về giá trị ở cột cuối cùng của bảng tham chiếu (cột PA), giống nhau hết.
Có anh chị nào giúp em tìm ra code đúng với, xin cảm ơn nhiều ạ.

Bạn không đưa File, mình đọc thật khó hình dung.
 
Upvote 0
Xin nhờ mọi người giúp giùm,

Mình có 1 sub như trên diễn đàn hướng dẫn:

Function PicFit(ByVal PictureFileName As String, Optional ByVal TargetCell As Range) As String
On Error Resume Next
If TargetCell Is Nothing Then Set TargetCell = Application.ThisCell
TargetCell.Worksheet.Shapes(TargetCell.Address).Delete
If CreateObject("Scripting.FileSystemObject").fileExists(PictureFileName) Then
TargetCell.Select
With TargetCell.Worksheet.Pictures.Insert(PictureFileName)
.Name = TargetCell.Address
.ShapeRange.LockAspectRatio = msoFalse
.Left = TargetCell.Left
.Top = TargetCell.Top
.Width = TargetCell.Width
.Height = TargetCell.Height
End With
End If
End Function

Sử dụng để add picture vào 1 worksheet rất ổn, nhưng khi send file cho máy khác thì lại không có link nên ko thấy hình. Có cách nào để add vĩnh viễn, sau khi mở ra nó không tự tìm link nữa hay không?

Cảm ơn mọi người giúp đỡ.
 
Upvote 0
Em có đoạn code gộp nhiều file sang 1 file mới chạy trên office 2007 không được. Folder "OK" chạy ổn nhưng folder "Khong duoc" chạy bị lỗi

Em muốn chèn nguồn của dữ liệu truy xuất, file Vidu (STT, dòng và sheet của các file 1,2,3 và 4,5,6 vào cột A trước các hàng gộp dữ liệu có được không). Ví dụ cột A dòng 2 thể hiện: C:\Documents and Settings\Admin\Desktop\OK\4.xls\Ngày1\row2


Sub MergeFilesExcel()
Dim path As String, ThisWB As String, lngFilecounter As Long
Dim wbDest As Workbook, shtDest As Worksheet, ws As Worksheet
Dim Filename As String, Wkb As Workbook
Dim CopyRng As Range, Dest As Range
Dim RowofCopySheet As Integer
RowofCopySheet = 2
ThisWB = ActiveWorkbook.Name
'Dien duong dan folder chua cac tap tin excel can gom lai.
'Nhu ban thay toi tien duong dan thu muc chua cai file excel cua toi.
path = "D:\Test\Khong duoc"
Application.EnableEvents = False
Application.ScreenUpdating = False
Set shtDest = ActiveWorkbook.Sheets(1)
Filename = Dir(path & "\*.xls", vbNormal)
If Len(Filename) = 0 Then Exit Sub
Do Until Filename = vbNullString
If Not Filename = ThisWB Then
Set Wkb = Workbooks.Open(Filename:=path & "\" & Filename)
Set CopyRng = Wkb.Sheets(1).Range(Cells(RowofCopySheet, 1), Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count))
Set Dest = shtDest.Range("A" & shtDest.UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1)
CopyRng.Copy Dest
Wkb.Close False
End If
Filename = Dir()
Loop
Range("A1").Select
Application.EnableEvents = True
Application.ScreenUpdating = True
MsgBox "Ket Thuc!"
End Sub
 

File đính kèm

Upvote 0
Chào anh chị GPE,
em muốn xóa từ sheets(8) trở về sau, nhưng đoạn code bên dưới khi chạy không xóa như yêu cầu,
anh chị xem giúp em code này chưa đúng ở đoạn nhé. em cám ơn

PHP:
Sub xoasheets()
Dim j As Integer
Application.DisplayAlerts = False
    For j = 8 To Sheets.Count
        Sheets(j).Delete
    Next j
Application.DisplayAlerts = True
End Sub
 
Upvote 0
Chào anh chị GPE,
em muốn xóa từ sheets(8) trở về sau, nhưng đoạn code bên dưới khi chạy không xóa như yêu cầu,
anh chị xem giúp em code này chưa đúng ở đoạn nhé. em cám ơn

PHP:
Sub xoasheets()
Dim j As Integer
Application.DisplayAlerts = False
    For j = 8 To Sheets.Count
        Sheets(j).Delete
    Next j
Application.DisplayAlerts = True
End Sub
Thử sửa Sheets(j). Delete thành Sheets(8).Delete xem sao
 
Upvote 0
Chào anh chị GPE,
em muốn xóa từ sheets(8) trở về sau, nhưng đoạn code bên dưới khi chạy không xóa như yêu cầu,
anh chị xem giúp em code này chưa đúng ở đoạn nhé. em cám ơn

PHP:
Sub xoasheets()
Dim j As Integer
Application.DisplayAlerts = False
    For j = 8 To Sheets.Count
        Sheets(j).Delete
    Next j
Application.DisplayAlerts = True
End Sub

PHP:
Sub XoaSheet()
    Dim Ws As Worksheet
    Set Ws = Worksheets(8)
    For Each Ws In Worksheets
        If Sheets.Count < 9 Then Exit For
        Ws.Delete
    Next Ws
End Sub
- Mình sẽ viết thế này, nhưng không biết sheets thứ 8 của bạn là 8 sheet, hay tên của sheet.
- Những mình nghĩ ràng buộc điều kiện loại trừ Sheet sẽ an toàn hơn.
 
Upvote 0
PHP:
Sub XoaSheet()
    Dim Ws As Worksheet
    Set Ws = Worksheets(8)
    For Each Ws In Worksheets
        If Sheets.Count < 9 Then Exit For
        Ws.Delete
    Next Ws
End Sub
- Mình sẽ viết thế này, nhưng không biết sheets thứ 8 của bạn là 8 sheet, hay tên của sheet.
- Những mình nghĩ ràng buộc điều kiện loại trừ Sheet sẽ an toàn hơn.
Chào bạn
sheets8 là thứ tự của sheets, bạn xem lại giúp mình nha
upload_2017-7-19_10-43-53.png
 
Upvote 0
Chào anh chị GPE,
em muốn xóa từ sheets(8) trở về sau, nhưng đoạn code bên dưới khi chạy không xóa như yêu cầu,
anh chị xem giúp em code này chưa đúng ở đoạn nhé. em cám ơn

PHP:
Sub xoasheets()
Dim j As Integer
Application.DisplayAlerts = False
    For j = 8 To Sheets.Count
        Sheets(j).Delete
    Next j
Application.DisplayAlerts = True
End Sub

Code này chỉ xoá sheet thứ 8, 10, ... thôi; sheets 9, 11,... sẽ bị bỏ sót.
Lý do: sau khi xoá 8 thì 9 sẽ trở thành 8, vòng lặp tới số 9 thực ra là xoá cái trước đó mang số 10, và cứ tiếp tục theo chiều hướng này mà lấy 1 sót 1.
Muốn xoá kể ừ 8 thì phải xoá ngược từ count trở về. Hoặc dùng vòng lặp while

For j=sheets.count to 8 step -1
sheets(j).delete
next j

Do while sheets.count >= 8
sheets(sheets.count).delete
loop

Chú thích quan trọng: làm việc với tập (collection) khác với mảng (array). Xóa 1 phần tử trong mảng không ảnh hưởng đến các phần tử còn lại. Trong khi đó, xóa 1 phần tử trong collection thì các phần tử sau nó sẽ tự dồn thứ tự lên.
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Sub XoaSheet()
    Dim Ws As Worksheet
    Set Ws = Worksheets(8)
    For Each Ws In Worksheets
        If Sheets.Count < 9 Then Exit For
        Ws.Delete
    Next Ws
End Sub
- Mình sẽ viết thế này, nhưng không biết sheets thứ 8 của bạn là 8 sheet, hay tên của sheet.
- Những mình nghĩ ràng buộc điều kiện loại trừ Sheet sẽ an toàn hơn.

Code này làm ngược lại với yêu cầu chủ thớt. Tức là nó sẽ xoá tất cả các sheets, chừa lại 8 cái cuối cùng.
 
Upvote 0
Code này chỉ xoá sheet thứ 8, 10, ... thôi; sheets 9, 11,... sẽ bị bỏ sót.
Lý do: sau khi xoá 8 thì 9 sẽ trở thành 8, vòng lặp tới số 9 thực ra là xoá cái trước đó mang số 10, và cứ tiếp tục theo chiều hướng này mà lấy 1 sót 1.
Muốn xoá kể ừ 8 thì phải xoá ngược từ count trở về. Hoặc dùng vòng lặp while

For j=sheets.count to 8 step -1
sheets(j).delete
next j

Do while sheets.count >= 8
sheets(sheets.count).delete
loop

Chú thích quan trọng: làm việc với tập (collection) khác với mảng (array). Xóa 1 phần tử trong mảng không ảnh hưởng đến các phần tử còn lại. Trong khi đó, xóa 1 phần tử trong collection thì các phần tử sau nó sẽ tự dồn thứ tự lên.
Đây là cách người ta vẫn thường làm (vòng lập ngược từ dưới lên)... nhưng tôi xem code của tác giả thì thấy cách sửa nhanh gọn nhất là sửa Sheets(j) thành Sheets(8) cũng xong! (toàn bộ code để nguyên)
Nguyên tắc vẫn là: Xóa sheets(8) xong thì Sheets(9) lập tức trở thành Sheets(8)... ta lại cứ tiếp tục xóa Sheets(8) đến khi xong thì thôi
Vẫn về đến La Mã!
 
Upvote 0
Chào anh chị GPE,
Em có đoạn code muốn copy giá trị sheets như bên dưới, khi chạy báo lỗi dòng
PHP:
Sheets(j).Range("C1:S500").Select
anh chị kiểm tra giúp em nhé. em cám ơn ạ
PHP:
Sub copygiatri()
Dim j As Integer
Application.DisplayAlerts = False
    For j = 8 To Sheets.Count
        Sheets(j).Range("C1:S500").Select
        Selection.copy
    Selection.PasteSpecial Paste:=xlPasteValues
            Application.CutCopyMode = False
    Next j
Application.DisplayAlerts = True
End Sub
 
Upvote 0
Báo lỗi ra sao?
(tôi có thể đoán lỗi; nhưng bạn là người tập viết code thì cũng nên tập chú ý đến cách VBA báo lỗi)

Gợi ý: có một số trường hợp, thâu macro xong rồi chỉ việc bỏ vào vòng lặp là xong. Nhưng cũng có một số trường hợp code đó chỉ hoạt động được 1 lần (điển hình là chỉ trên 1 sheet). Muốn làm nhiều lần thì phải thâu macro trong lúc làm 2 hay 3 sheets.
 
Upvote 0
Báo lỗi ra sao?
(tôi có thể đoán lỗi; nhưng bạn là người tập viết code thì cũng nên tập chú ý đến cách VBA báo lỗi)

Gợi ý: có một số trường hợp, thâu macro xong rồi chỉ việc bỏ vào vòng lặp là xong. Nhưng cũng có một số trường hợp code đó chỉ hoạt động được 1 lần (điển hình là chỉ trên 1 sheet). Muốn làm nhiều lần thì phải thâu macro trong lúc làm 2 hay 3 sheets.
Em gửi hình lỗi
upload_2017-7-20_9-14-57.png
record macro nhiều sheets em sẽ chú ý.
 

File đính kèm

  • upload_2017-7-20_9-14-55.png
    upload_2017-7-20_9-14-55.png
    6.8 KB · Đọc: 1
Upvote 0
Bạn nhận xét sai rồi. Tuy nhiên, tập nhận xét nhiều sẽ quen.
Với 1 sheet, phương thức Select mặc định là sheet đang active (activated)
Với nhiều sheets, trước khi select, bạn phải activate sheet
Code của bạn chỉ cần thêm
Sheets(j).Activate
Trước dòng
Sheets(j).Range("C1:S500").Select
 
Upvote 0
Bạn nhận xét sai rồi. Tuy nhiên, tập nhận xét nhiều sẽ quen.
Với 1 sheet, phương thức Select mặc định là sheet đang active (activated)
Với nhiều sheets, trước khi select, bạn phải activate sheet
Code của bạn chỉ cần thêm
Sheets(j).Activate
Trước dòng
Sheets(j).Range("C1:S500").Select
Em làm được rồi, em sẽ chú ý hơn những lần sau. Cám ơn anh nhiều
 
Upvote 0
Chào anh chị GPE,
Em có đoạn code muốn copy giá trị sheets như bên dưới, khi chạy báo lỗi dòng
PHP:
Sheets(j).Range("C1:S500").Select
anh chị kiểm tra giúp em nhé. em cám ơn ạ
PHP:
Sub copygiatri()
Dim j As Integer
Application.DisplayAlerts = False
    For j = 8 To Sheets.Count
        Sheets(j).Range("C1:S500").Select
        Selection.copy
    Selection.PasteSpecial Paste:=xlPasteValues
            Application.CutCopyMode = False
    Next j
Application.DisplayAlerts = True
End Sub
Về phần tại sao báo lỗi thì các bài trên đã nói rồi. Tôi chỉ gợi ý bạn cách khác để rút gọn
1>
Mã:
Sub copygiatri()
  Dim j As Integer
  For j = 8 To Sheets.Count
       With Sheets(j).Range("C1:S500")
          .copy
          .PasteSpecial Paste:=xlPasteValues
       End With
    Next j
End Sub
Hoặc
2>
Mã:
Sub copygiatri()
  Dim j As Integer
  For j = 8 To Sheets.Count
       With Sheets(j).Range("C1:S500")
          .Value = .Value
       End With
    Next j
End Sub
 
Upvote 0
cho mình ké top chút nha, mình tạo macro trong excel mấy hôm trước tạo bình thường, nhưng bây giờ thị bị lỗi rồi, mình chỉ tạo được macro cho từng file excel thôi, không tao được macro dùng cho nhiều file excel. mọi người giúp mình nha, mình xài bản tiếng trung nên không biết nó thông báo gi, minh chọn 2 dòng dưới thì tạo được macro, còn chọn dòng trên cùng thì không tạo được.
 

File đính kèm

  • hinh.jpg
    hinh.jpg
    276.1 KB · Đọc: 6
  • hinh1.jpg
    hinh1.jpg
    280 KB · Đọc: 4
Upvote 0
cho mình ké top chút nha, mình tạo macro trong excel mấy hôm trước tạo bình thường, nhưng bây giờ thị bị lỗi rồi, mình chỉ tạo được macro cho từng file excel thôi, không tao được macro dùng cho nhiều file excel. mọi người giúp mình nha, mình xài bản tiếng trung nên không biết nó thông báo gi, minh chọn 2 dòng dưới thì tạo được macro, còn chọn dòng trên cùng thì không tạo được.
Đang hỏi bên đây cơ mà?
http://www.giaiphapexcel.com/dienda...g-mọi-người-giúp-mình-với.128044/#post-802102
 
Upvote 0
Cho em hỏi sao tên Macro của em bị dài thế nhỉ? có cách nào sửa không? lắm lúc nhìn hoa hết cả mắt! em xin cảm ơn
 

File đính kèm

  • 2.png
    2.png
    104.5 KB · Đọc: 21
Upvote 0
em gỡ hẳn đi xong add lại macro nó vẫn bị dài thế! giống như kiểu bật file khác có marco file, nhưng em mở 1 file thôi ạ!
cứ nhấn vào chạy thử đi bạn, vẫn chạy được là được rồi, không ảnh hưởng gì đến hòa bình thế giới đâu:D:p
 
Upvote 0
sẵn mọi người cho mình hỏi vấn đề này
mình nhớ hình như có 1 cách sắp xếp theo thứ tự tăng dần hoặc giảm dần dùng lệnh XXX.sort (mảng 1 chiều) mà quên mất chỗ XXX đó là cái gì, mong mọi người chỉ lại
mình nhớ mang máng nó là crep... hay con... gì gì đấy mà tìm google hoài chả ra
 
Upvote 0
sẵn mọi người cho mình hỏi vấn đề này
mình nhớ hình như có 1 cách sắp xếp theo thứ tự tăng dần hoặc giảm dần dùng lệnh XXX.sort (mảng 1 chiều) mà quên mất chỗ XXX đó là cái gì, mong mọi người chỉ lại
mình nhớ mang máng nó là crep... hay con... gì gì đấy mà tìm google hoài chả ra

Cái XXX dó là một object của một class bên trong có ít nhất là một cái mảng và một phương thức tên là sort
 
Upvote 0
Cái XXX dó là một object của một class bên trong có ít nhất là một cái mảng và một phương thức tên là sort
em nhớ nó là 1 hàm của thư viện chứ không phải là class do người dùng viết anh ạ
và em đã tìm được nó trong diễn đàn này trong 1 file đính kèm, mà giờ chẳng biết file đó là file nào để mà tìm lại
nội dung nó tương tự như này
chỗ XXXXXX đấy ạ
Mã:
Sub GPE()
    Dim objArray As Object
    Set objArray = CreateObject("XXXXXX")
    ReDim myArray(0 To 5) As Integer
    myArray(0) = 4
    myArray(1) = 1
    myArray(2) = 5
    myArray(3) = 6
    myArray(4) = 7
    myArray(5) = 2
    myArray = objArray.Sort(myArray)
    Range("A1").Resize(6, 0) = myArray
End Sub
[code]
 
Upvote 0
Chào mọi người. như ta có code sau để Set NameRibbon = RIBBON
RIBBON là tab trên Ribbon của người dùng tạo
Mã:
Public NameRibbon As IRibbonUI
Sub OnLoadRibbon(RIBBON As IRibbonUI)
   Set NameRibbon = RIBBON
End Sub
nhưng nếu có 1 câu lệnh End thì biến NameRibbon sẽ mất
và như thế lại phải đóng file mở lại để có thể Set NameRibbon = RIBBON lại được nữa
vậy làm sao có thể set luôn khi đã biết id của nó không ví dụ như TAB người dùng đó có ID là "XYZ"
 
Lần chỉnh sửa cuối:
Upvote 0
em nhớ nó là 1 hàm của thư viện chứ không phải là class do người dùng viết anh ạ
và em đã tìm được nó trong diễn đàn này trong 1 file đính kèm, mà giờ chẳng biết file đó là file nào để mà tìm lại
nội dung nó tương tự như này
chỗ XXXXXX đấy ạ
Mã:
Sub GPE()
    Dim objArray As Object
    Set objArray = CreateObject("XXXXXX")
    ReDim myArray(0 To 5) As Integer
    myArray(0) = 4
    myArray(1) = 1
    myArray(2) = 5
    myArray(3) = 6
    myArray(4) = 7
    myArray(5) = 2
    myArray = objArray.Sort(myArray)
    Range("A1").Resize(6, 0) = myArray
End Sub
[code]
Có phải bạn nói cái này không?
PHP:
CreateObject("System.Collections.ArrayList")
 
Upvote 0
Có phải bạn nói cái này không?
PHP:
CreateObject("System.Collections.ArrayList")
vâng, cảm ơn anh huuthang_bd, đúng là nó rồi.
sẵn cho em hỏi thêm, nếu dùng cách này để sắp xếp dữ liệu thì nó có nhanh hơn nếu dùng vòng lặp so sánh thông thường hay dùng CreateObject("MSScriptControl.ScriptControl") để sắp xếp không anh nhỉ
nếu dùng CreateObject("System.Collections.ArrayList")
thì có khác gì so với CreateObject("MSScriptControl.ScriptControl") hay không
 
Upvote 0
vâng, cảm ơn anh huuthang_bd, đúng là nó rồi.
sẵn cho em hỏi thêm, nếu dùng cách này để sắp xếp dữ liệu thì nó có nhanh hơn nếu dùng vòng lặp so sánh thông thường hay dùng CreateObject("MSScriptControl.ScriptControl") để sắp xếp không anh nhỉ
nếu dùng CreateObject("System.Collections.ArrayList")
thì có khác gì so với CreateObject("MSScriptControl.ScriptControl") hay không
Chỉ là gửi link tham khảo:
http://www.giaiphapexcel.com/dienda...o-dãy-số-ngẫu-nhiên-không-trùng.125815/page-3

http://www.giaiphapexcel.com/dienda...-tự-động-sắp-xếp-tăng-dần-trong-1-cell.98151/

So sánh nhanh chậm phải vào trường hợp cụ thể, xét nhiều trường hợp của dữ liệu mới đánh giá được. (Ví dụ: so sánh tốc độ mổ gà / mổ trâu của 2 con dao, không tính các yếu tố khác ngoài dao).
 
Upvote 0
em nhớ nó là 1 hàm của thư viện chứ không phải là class do người dùng viết anh ạ

Tôi có nói nó là class do ngừoi dùng viết đâu?
CreateObject("System.Collections.ArrayList")
Bài #1108 nói về 2 cái, 1 là object2 là class
ArrayList là một class được định nghĩa trong thư viên System.Collection

Trước khi tiếp tục tìm hiểu thêm về ba cái mớ sọt siếc này nọ, bạn cần học hỏi thêm về khái niệm thư viện, hàm và class. Hàm/phương thức/thủ tục là một phần tử của class.

 
Upvote 0
Chỉ là gửi link tham khảo:
http://www.giaiphapexcel.com/diendan/threads/nhờ-chỉnh-code-tạo-dãy-số-ngẫu-nhiên-không-trùng.125815/page-3

http://www.giaiphapexcel.com/diendan/threads/nhờ-giúp-làm-hàm-tự-động-sắp-xếp-tăng-dần-trong-1-cell.98151/

So sánh nhanh chậm phải vào trường hợp cụ thể, xét nhiều trường hợp của dữ liệu mới đánh giá được. (Ví dụ: so sánh tốc độ mổ gà / mổ trâu của 2 con dao, không tính các yếu tố khác ngoài dao).

Chính MS cảnh báo rằng ScriptControl là cái đặc biệt chỉ nên dùng cho dân làm Web. So sánh cái quái gì nữa. Chả biết ngừoi hỏi câu này lấy ở đâu ra để mà thắc mắc. Lượm lặt code thì chịu khó sử dụng chúng mọt thời gian cho quen rồi hãy nghĩ đến việc so sánh. Ít nhất khi đó ngừoi ta có cái cơ sở để benchmark.
 
Upvote 0
Nhờ các anh xem hộ em code hidesheet bị lỗi debug
----------------------------------------------------------
Sub HideSheets()
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
For Each ws In ThisWorkbook.Worksheets
If InStr(1, ws.Name, "Sheet17", vbTextCompare) = 0 Then
ws.Visible = xlVeryHidden
End If
Next ws
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Sub
 

File đính kèm

Upvote 0
Nhờ các anh xem hộ em code hidesheet bị lỗi debug
----------------------------------------------------------
Sub HideSheets()
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
For Each ws In ThisWorkbook.Worksheets
If InStr(1, ws.Name, "Sheet17", vbTextCompare) = 0 Then
ws.Visible = xlVeryHidden
End If
Next ws
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Sub
1. ws.CodeName, "Sheet17"
hoặc:
2. ws.Name, "Thong tin"
 
Upvote 0
Nhờ các anh xem hộ em code hidesheet bị lỗi debug
----------------------------------------------------------
Sub HideSheets()
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
For Each ws In ThisWorkbook.Worksheets
If InStr(1, ws.Name, "Sheet17", vbTextCompare) = 0 Then
ws.Visible = xlVeryHidden
End If
Next ws
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Sub
Sao không so sánh bằng mà dùng hàm InStr?
 
Upvote 0
e chỉ biết sử dụng code thôi anh à! lỗi này bác Befaint sửa rồi ạ
biết sử dụng chứ không biết viết sao bạn (thông cảm! chỉ thắc mắc thôi chứ không có ý khác, tại thấy mấy bài trước có code nhìn kinh vãi)
à! sẵn gửi cho bạn code FixRowHight ở mấy bài trước bạn nhờ sửa lỗi
mình có xem và phát hiện ra code sẽ lỗi nếu ngay trên trang tính của bạn có lỗi
ví dụ #VALUE hoặc tương tự.... có lỗi là nó tèo ngay
code này bạn chỉ cần truyền vùng cần fix vào thôi, hoặc lười thì nó tự tìm vùng mà chỉnh cho bạn
tốt nhất nên cho code này vào Addins rồi dùng. tại vì trong quá trình sử dụng code sẽ tạo 1 sheet tạm để chạy code
 

File đính kèm

Upvote 0
So sánh chuỗi trong VBA người ta thường dùng Like
Và trước khi so sánh thì cần chuyển về cùng kiểu chữ in hoa hay chữ thường.
Trong trường hợp này tên sheet là do mình đặt nên tôi nghĩ so sánh bằng trực tiếp không cần chuyển chữ hoa-thường cũng không vấn đề gì.
 
Upvote 0
Chào mọi người,

Hiện tại e có useform này, em muốn paste dữ liệu đã copy sẵn bên cột clipboard sang useform, nhưng không được, mọi người có code nào có thể hỗ trợ giùm em với ạ
 

File đính kèm

  • Book1.xlsm
    Book1.xlsm
    232.6 KB · Đọc: 7
  • Untitled.png
    Untitled.png
    187.6 KB · Đọc: 11
Upvote 0
Chào mọi người,

Hiện tại e có useform này, em muốn paste dữ liệu đã copy sẵn bên cột clipboard sang useform, nhưng không được, mọi người có code nào có thể hỗ trợ giùm em với ạ

Sao bạn làm phức tạp vấn đề thế.
- Bạn hãy nêu lại câu hỏi rõ ràng, mục đích , có đầu đuôi xem nào?
 
Upvote 0
Hi bạn,

Mục đích của mình là copy từ những trang web hoặc ứng dụng bên ngoài, sử dụng chế độ clipboar để có thể copy cùng lúc nhiều thứ như trong hình, sau đó sẽ mở useform và paste những thứ đã copy được vào useform này , bạn hiểu ý mình không ?
 
Upvote 0
Cho em hỏi? em mở file cell lên bị báo lỗi như này làm thế nào ạ:
lỗi mở excel Error desciption: open method of workbooks class faied
 
Upvote 0
Các bạn giúp mình với.
Mình muốn copy sheet1 từ một workbook khác vào workbook đang mở. Nhưng trước khi copy, kiểm tra workbook đang mở xem đã có sheet1 đó chưa. Nếu đã có, chỉ copy dữ liệu đè vào thôi (không xoá sheet1 đã có). Còn nếu sheet1 đó chưa có, thì copy nguyên cả sheet1 vào.
Các bạn xem và chỉ giúp mình với. Mình cảm ơn nhiều!!!
 
Upvote 0
Các bạn giúp mình với.
Mình muốn copy sheet1 từ một workbook khác vào workbook đang mở. Nhưng trước khi copy, kiểm tra workbook đang mở xem đã có sheet1 đó chưa. Nếu đã có, chỉ copy dữ liệu đè vào thôi (không xoá sheet1 đã có). Còn nếu sheet1 đó chưa có, thì copy nguyên cả sheet1 vào.
Các bạn xem và chỉ giúp mình với. Mình cảm ơn nhiều!!!
Bạn thử nghiên cứu ADO xem. Có thể giúp bạn đó.
Hoặc nghiên cứu Macro 4 xem sao.
 
Upvote 0
Các bác giúp cháu với ạ! File cháu đính kèm rồi.
Sheet dữ liệu là dữ liệu đầu vào.
Sheet thang điểm là căn cứ để tính điểm.
Làm thế nào để tạo ra sheet kết quả từ dữ liệu căn cứ vào thang điểm chuẩn ạ.

Các bác cho cháu phương hướng giải quyết vấn đề như thế nào để tối ưu nhất ạ?
Cháu định lặp từng dòng 1 nhưng cháu thấy nó không ổn vì tốc độ có thể rất chậm và có khi phải lặp mấy lần mới được.
 

File đính kèm

Upvote 0
Cho em hỏi? em mở file cell lên bị báo lỗi như này làm thế nào ạ:
lỗi mở excel Error desciption: open method of workbooks class faied
- Thông báo lỗi đã nêu khá trực quan: Chi tiết lỗi là Phương thức Open của Workbooks bị lỗi, bạn xem lại Tên file bạn mở, đường dẫn trong tham số Open.
 
Upvote 0
Các bạn giúp mình với.
Mình muốn copy sheet1 từ một workbook khác vào workbook đang mở. Nhưng trước khi copy, kiểm tra workbook đang mở xem đã có sheet1 đó chưa. Nếu đã có, chỉ copy dữ liệu đè vào thôi (không xoá sheet1 đã có). Còn nếu sheet1 đó chưa có, thì copy nguyên cả sheet1 vào.
Các bạn xem và chỉ giúp mình với. Mình cảm ơn nhiều!!!
- Mình có ý này, bạn tham khảo nhé. Đầu tiên bạn kiểm tra workbook đang mở có sheet1 như bạn mong muốn hay không. Có thể dùng vòng lặp for each để duyệt qua các sheet, và kiểm tra tên của Sheet có hay không.
- Nếu Có sheet1 thì chỉ copy vùng.
- Nếu không có thì tiến hành Move sheet bên kia qua luôn hoặc Copy toàn bộ dữ liệu.
 
Upvote 0
Chào mọi người, mọi người cho mình hỏi vấn đề này với
ví dụ mình có công thức tại cell như thế này
=ROUND(SUMIFS(M$38:$M41;$I38:$I$41;">10";I38:I41;"<=18")/1000;3)*1
giờ mình muốn code điền lại vào cell thành công thức thế này thì viết code thế nào ạ
=ROUND(SUMIFS($M$38:$M$41;$I$38:$I$41;">10";$I$38:$I$41;"<=18")/1000;3)*1
tức là thêm $ vào tất cả tham chiếu để cố định vùng lại í.
 
Upvote 0
Theo em hiểu ý bạn của trên: Làm sao xác định được ô M38 (vùng bất kỳ) mà chuyển thành dạng địa chỉ cố định.

Tức là, có một cell có chứa công thức: cell.Formula trả về 1 chuỗi.

(1): "=ROUND(SUMIFS(M$38:$M41;$I38:$I$41;">10";I38:I41;"<=18")/1000;3)*1"

Giờ cần tìm trong chuỗi trên, cứ chỗ nào là range thì chuyển về dạng địa chỉ cố định:

(2): "=ROUND(SUMIFS($M$38:$M$41;$I$38:$I$41;">10";$I$38:$I$41;"<=18")/1000;3)*1"
 
Upvote 0
Theo em hiểu ý bạn của trên: Làm sao xác định được ô M38 (vùng bất kỳ) mà chuyển thành dạng địa chỉ cố định.
Bạn ấy khong phải là thành viên mới. Đã từng hỏi ở đây trên chục bài rồi. Néu muốn nói chuyện rõ ràng thì ít nhất cũng phải cho biết cái chuỗi kia lấy ở đâu ra. Ai hơi đâu mà đoán mò giùm.

Vì bạn ấy không nói chuyện rõ ràng cho nên tôi cũng trả lời tổng quát. Ý của tôi là giải thích chung cho các bạn cần biết sự khác biệt giữa tham chiếu tương đối và tuyệt đối.
 
Upvote 0
Chào mọi người, mọi người cho mình hỏi vấn đề này với
ví dụ mình có công thức tại cell như thế này
=ROUND(SUMIFS(M$38:$M41;$I38:$I$41;">10";I38:I41;"<=18")/1000;3)*1
giờ mình muốn code điền lại vào cell thành công thức thế này thì viết code thế nào ạ
=ROUND(SUMIFS($M$38:$M$41;$I$38:$I$41;">10";$I$38:$I$41;"<=18")/1000;3)*1
tức là thêm $ vào tất cả tham chiếu để cố định vùng lại í.
Tôi viết thành add-in nên mở topic mới cho mọi người dễ tìm. Bạn vào link bên dưới xem nhé.
http://www.giaiphapexcel.com/diendan/threads/add-in-thay-đổi-kiểu-tham-chiếu-trong-công-thức.129258/
 
Upvote 0
Làm thế nào để phân biệt những chỗ mà mình muốn thay đổi kiểu? Thường thường công thức sẽ được nới dài thêm, và chúng có thể gồm cả tuyệt đối lẫn tương đối.
 
Upvote 0
Đây làm một hàm để so sánh số lớn nhất trong một vùng dữ liệu (Range) nào đó.

Nó căn cứ từ ô đầu tiên của vùng [ Ran.Cells(1, 1) ] làm chuẩn để so sánh với các ô trong vùng đó.

Với câu lệnh này:

If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)

Với d đại diện cho hàng và c đại diện cho cột, khi vòng lặp chạy lần lượt đến mỗi ô trong Vùng tham chiếu, nếu gặp ô có giá trị lớn hơn giá trị ban đầu max = Ran.Cells(1, 1) thì max sẽ nhận giá trị tại ô đó rồi tiếp tục so sánh sang ô khác, còn không thì nó vẫn giữ giá trị lớn nhất.

=============================
Cái mà tôi không hiểu gì trong hàm đó là cái này:

v = Tim(max, Ran)

Chả biết nó dùng để làm gì nữa!
nhờ anh Hoàng Trọng Nghĩa giúp đỡ bài này ! Em có 1 file quản lí thông tin khách hàng và 1 form nhập liệu chưa viết code.
Muốn nhờ anh viết hộ code để khi nhập dữ liệu vào combobox khách hàng thì dữ liệu sẽ tự tham chiếu đến Sheet khách hàng. Nếu có trường hợp thỏa mãn thì sẽ hiện hết thông tin lên list box, click vào chọn 1 hàng trong list thì dữ liệu từ list box sẽ add vào các text box bên dưới theo các mục tương ứng, có thể cập nhật và thay đổi được.
 

File đính kèm

Upvote 0
Theo mình, bạn còn thiếu 2 bảng;
1 bảng liệt kê danh sách hàng hóa, gồm [Mã hàng], [Tên hàng], . . . .
2 Bảng danh sách khách hàng; gồm [Mã KH], [Tên KH], [Ngày sinh], [SĐT], [Địa chỉ], [Ghi chú],. . . .
Một khi bạn có 2 bảng này thì trang dữ liệu hiện tại sẽ bỏ bớt các trường, nhất là dữ liệu đã có ở bảng 'DSKH' như [SĐT], [NgàySinh], . . .
Bạn nên có [Mã KH], nếu không có cái này, thì sau này bạn sẽ fải nuốt tiếc muôn tả.

Nghĩa là trước khi tạo Form hay gì, gì khác, ta fải bỏ nhiều thời gian để có 1 cấu trúc CSDL thiệc hoàn chỉnh cái đã; Theo mình chuyện này là xương sống của hoạt động 1 CSDL bình thường & chu chỉnh.

Vui nếu được trao đổi thêm cùng bạn.
 
Upvote 0
Theo mình, bạn còn thiếu 2 bảng;
1 bảng liệt kê danh sách hàng hóa, gồm [Mã hàng], [Tên hàng], . . . .
2 Bảng danh sách khách hàng; gồm [Mã KH], [Tên KH], [Ngày sinh], [SĐT], [Địa chỉ], [Ghi chú],. . . .
Một khi bạn có 2 bảng này thì trang dữ liệu hiện tại sẽ bỏ bớt các trường, nhất là dữ liệu đã có ở bảng 'DSKH' như [SĐT], [NgàySinh], . . .
Bạn nên có [Mã KH], nếu không có cái này, thì sau này bạn sẽ fải nuốt tiếc muôn tả.

Nghĩa là trước khi tạo Form hay gì, gì khác, ta fải bỏ nhiều thời gian để có 1 cấu trúc CSDL thiệc hoàn chỉnh cái đã; Theo mình chuyện này là xương sống của hoạt động 1 CSDL bình thường & chu chỉnh.

Vui nếu được trao đổi thêm cùng bạn.
Cảm ơn bạn đã tư vấn. Nhưng nếu mình tách dữ liệu ra làm 2 bảng như bạn nói thì khi find dữ liệu không biết listbox có hiển thị đầy đủ được các trường mình cần k nhỉ. Ví dụ mình nhập Mã hàng(MH) là N1A thì list sẽ hiển thị tất cả các KH, địa chỉ, sđt, ghi chú của những khách hàng đã đặt sản phẩm N1A mình chỉ việc cập nhật thêm thông tin nếu có thay đổi. Nếu tách ra mà vẫn cập nhật được như vậy thì tốt quá, nếu có thời gian bạn hãy chỉ giáo giúp, xin chân thành cảm ơn.
 
Upvote 0
Trong ListBox lúc đó chỉ có các trường [Mã Hàng], [Tên hàng], [Mã KH] & [Tên KH]
& bạn có thể thay 2 trong 4 loại dữ liệu này mà thôi.

Nếu bạn cần đổi/thay hay sửa dữ liệu của khách hàng như [Ngày Sinh], [SĐT], hay {Địa chỉ], không fải là vô lý lắm sao?
Trong quá trình vận hành, các dữ liệu này cũng cần thay đổi hay cập nhật; Nhưng lúc đó ta thực hiện bằng cách khác hơn (trực tiếp hay bằng Form khác chứ!)
 
Upvote 0
Trong ListBox lúc đó chỉ có các trường [Mã Hàng], [Tên hàng], [Mã KH] & [Tên KH]
& bạn có thể thay 2 trong 4 loại dữ liệu này mà thôi.

Nếu bạn cần đổi/thay hay sửa dữ liệu của khách hàng như [Ngày Sinh], [SĐT], hay {Địa chỉ], không fải là vô lý lắm sao?
Trong quá trình vận hành, các dữ liệu này cũng cần thay đổi hay cập nhật; Nhưng lúc đó ta thực hiện bằng cách khác hơn (trực tiếp hay bằng Form khác chứ!)
Bạn nói đúng quá, mình hiểu rồi. Mình đã sửa lại và sắp xếp lại CSDL, tiện đây bạn có thể giúp mình xem có code nào để khi mình nhập dữ liệu vào combobox thì listbox sẽ hiển thị tất cả các mã hàng có tên giống nhau không,
Vd: combobox nhập N1A thì listbox sẽ hiển thị toàn bộ sản phẩm N1A và các thông tin liên quan đến KH,SDT, địa chỉ, ghi chú.(chỉ cần hiển thị không chỉnh sửa ) Mục ghi chú và số lượng đặt thì mình có thể chọn 1 trong những KH nhất định để cập nhật ghi chú, số lượng, sau khi đã giao hàng được không .
 

File đính kèm

Upvote 0
Bạn nói đúng quá, mình hiểu rồi. Mình đã sửa lại và sắp xếp lại CSDL, tiện đây bạn có thể giúp mình xem có code nào để khi mình nhập dữ liệu vào combobox thì listbox sẽ hiển thị tất cả các mã hàng có tên giống nhau không,
Vd: combobox nhập N1A thì listbox sẽ hiển thị toàn bộ sản phẩm N1A và các thông tin liên quan đến KH,SDT, địa chỉ, ghi chú.(chỉ cần hiển thị không chỉnh sửa ) Mục ghi chú và số lượng đặt thì mình có thể chọn 1 trong những KH nhất định để cập nhật ghi chú, số lượng, sau khi đã giao hàng được không .
Mã hàng có liên quan gì đến khách hàng không bạn?
 
Upvote 0
Bạn xem file & fản hồi; Mai ta sẽ tiếp tục sớm

Vấn đề bổ sung khách hàng (KH) ngay trên form này là không nên;
Nếu thường xuyên bổ sung hay thay đổi danh sách KH thì nên thực hiện trên 1 form khác; nếu ít hay thỉnh thoảng thì nên thay trực tiếp trên trang 'DS'
Mã hàng có liên quan gì đến khách hàng không bạn?
KH đặt hàng thông qua mã hàng mà.

(Xin các bạn xem file ở bài kế tiếp của mình, xin cảm ơn nhiều)
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn nói đúng quá, mình hiểu rồi. Mình đã sửa lại và sắp xếp lại CSDL, tiện đây bạn có thể giúp mình xem có code nào để khi mình nhập dữ liệu vào combobox thì listbox sẽ hiển thị tất cả các mã hàng có tên giống nhau không,
Vd: combobox nhập N1A thì listbox sẽ hiển thị toàn bộ sản phẩm N1A và các thông tin liên quan đến KH,SDT, địa chỉ, ghi chú.(chỉ cần hiển thị không chỉnh sửa ) Mục ghi chú và số lượng đặt thì mình có thể chọn 1 trong những KH nhất định để cập nhật ghi chú, số lượng, sau khi đã giao hàng được không .
Tóm lại là mình cần nhất vẫn là hiển thị được tất cả các KH đã đặt mua trong 1 sản phẩm, khi click vào 1
Bạn xem file & fản hồi; Mai ta sẽ tiếp tục sớm

Vấn đề bổ sung khách hàng (KH) ngay trên form này là không nên;
Nếu thường xuyên bổ sung hay thay đổi danh sách KH thì nên thực hiện trên 1 form khác; nếu ít hay thỉnh thoảng thì nên thay trực tiếp trên trang 'DS'

KH đặt hàng thông qua mã hàng mà.
cảmcảm ơn hoang2013, DS mình k thể làm trên sheet đc vì mỗi ngày mình phải nhập hơn 100,150 người. Dữ liệu của mình lên tới hàng nghìn dòng nên chỉ có làm trên form thôi. Hiện mình đang đi làm, chiều về mình sẽ xem file bạn gửi
 
Upvote 0
(1) Tóm lại là mình cần nhất vẫn là hiển thị được tất cả các KH đã đặt mua trong 1 sản phẩm, khi click vào 1
(2) Cảm ơn hoang2013, DS mình k thể làm trên sheet đc vì mỗi ngày mình phải nhập hơn 100,150 người.
Dữ liệu của mình lên tới hàng nghìn dòng nên chỉ có làm trên form thôi.

(1) Hiển thị thì được rồi đó. Bạn còn đòi sửa 1 hay cặp trong cả 6 trường/cột nữa, phải không?
Có nghĩa là sửa mã mặt hàng (kéo theo sửa tên mặt hàng); Sửa Mã KH (kéo theo sửa tên khách hàng; Sửa số lượng đặt hàng & tình trạng thanh toán.
Như vậy thì từng dòng dữ liệu còn thiếu 1 đơn vị thông tin, mà nó không thể thay đổi (ví dụ như số thứ tự, số phiếu hay/kết hợp với ngày tháng đặt hàng.
Nếu không có nó ta chả thể làm được gì khác & chỉ sau vài ba ngày CSDL của bạn sẽ thành đống rác bốt mùi.
Vậy nên ta cần chỉnh sửa ngay từ bây giờ. Qua đó mới thấy khâu thiết kế, cấu trúc CSDL ban đầu là tối quan trọng
Tất nhiên không ai có thể tránh sai lầm 1 khi mới bắt đầu.
Vậy nên mình cũng đã sửa lại cấu trúc CSDL, bạn xem xét & cho í kiến

(2) Đồng í với bạn là làm trên Form, nhưng là form hiện có luôn hay Form khác mới là vấn đề.
Nhưng theo mình ta tiếp tục cho xong cái Form này đi đã.
 

File đính kèm

Upvote 0
(1) Hiển thị thì được rồi đó. Bạn còn đòi sửa 1 hay cặp trong cả 6 trường/cột nữa, phải không?
Có nghĩa là sửa mã mặt hàng (kéo theo sửa tên mặt hàng); Sửa Mã KH (kéo theo sửa tên khách hàng; Sửa số lượng đặt hàng & tình trạng thanh toán.
Như vậy thì từng dòng dữ liệu còn thiếu 1 đơn vị thông tin, mà nó không thể thay đổi (ví dụ như số thứ tự, số phiếu hay/kết hợp với ngày tháng đặt hàng.
Nếu không có nó ta chả thể làm được gì khác & chỉ sau vài ba ngày CSDL của bạn sẽ thành đống rác bốt mùi.
Vậy nên ta cần chỉnh sửa ngay từ bây giờ. Qua đó mới thấy khâu thiết kế, cấu trúc CSDL ban đầu là tối quan trọng
Tất nhiên không ai có thể tránh sai lầm 1 khi mới bắt đầu.
Vậy nên mình cũng đã sửa lại cấu trúc CSDL, bạn xem xét & cho í kiến

(2) Đồng í với bạn là làm trên Form, nhưng là form hiện có luôn hay Form khác mới là vấn đề.
Nhưng theo mình ta tiếp tục cho xong cái Form này đi đã.
Cảm ơn Hoang2013 đã giúp đỡ đúng ý mình, nhờ có bạn mà mình lại học được thêm kiến thức về cách xây dựng CSDL, cách xây dựng của bạn rất hợp lí. Mình có thể nhờ bạn giúp 1 chút nữa được không, mình còn 1 file nữa, bạn có thể giúp mình viết code tương tự với cbxLenh làm tiêu chuẩn tìm kiếm, nếu thỏa mãn thì list box sẽ hiện hết các thông tin từ cột A:H, và khi mình click vào 1 giá trị thì giá trị của hàng được lựa chọn sẽ add dữ liệu vào 4 textbox tương ứng bên dưới, sau đó nếu ấn cập nhật thì dữ liệu có thể trực tiếp thay đổi ở trên bảng tính có sẵn được không. Mình biết là đòi hỏi quá nhưng bạn bớt chút thời gian giúp mình với nhé. Mình xin chân thành cảm ơn !
 

File đính kèm

Upvote 0
Rất sẵn lòng! Nhưng cần bạn nói rõ vấn đề như sau:
Trên cùng của Form là 1 ComboBox; Nó sẽ lấy dữ liệu từ đâu (nguồn của nó)
Thông thường thì ComboBox giúp ta chọn 1 (dòng) trong 1 danh sách nào đó; Ở đây chắc cột [A:a] của CSDL;
Như vậy là chọn 1 trong ngàn dòng cũng mệt.
Nếu đó là 1 TextBox thì là chuyện khác; Ta có thể gõ vô đó vài ba kí tự & ấn nút lệnh tìm; Bảo VBA tìm & hiện kết quả lên ListBox
(Nếu dữ liệu nhiều ta nên chọn cách này; Vì không tài thánh nào nhớ hết trong đầu các mã lệnh không ngắn chút nào như vậy.)
 
Upvote 0
Rất sẵn lòng! Nhưng cần bạn nói rõ vấn đề như sau:
Trên cùng của Form là 1 ComboBox; Nó sẽ lấy dữ liệu từ đâu (nguồn của nó)
Thông thường thì ComboBox giúp ta chọn 1 (dòng) trong 1 danh sách nào đó; Ở đây chắc cột [A:a] của CSDL;
Như vậy là chọn 1 trong ngàn dòng cũng mệt.
Nếu đó là 1 TextBox thì là chuyện khác; Ta có thể gõ vô đó vài ba kí tự & ấn nút lệnh tìm; Bảo VBA tìm & hiện kết quả lên ListBox
(Nếu dữ liệu nhiều ta nên chọn cách này; Vì không tài thánh nào nhớ hết trong đầu các mã lệnh không ngắn chút nào như vậy.)
Hi.
Chính xác là dùng cột A của Sheet1 để tham chiếu, bạn giúp mình bằng cách nào cũng được dù là textbox hay combobox, cách nào ngắn gọn và đơn giản nhất để khi đọc mình có thể học hỏi. Còn các mã lệnh do trên phiếu mình dùng mã vạch quét nên chắc sẽ không sao.
 
Upvote 0
Rất sẵn lòng! Nhưng cần bạn nói rõ vấn đề như sau:
Trên cùng của Form là 1 ComboBox; Nó sẽ lấy dữ liệu từ đâu (nguồn của nó)
Thông thường thì ComboBox giúp ta chọn 1 (dòng) trong 1 danh sách nào đó; Ở đây chắc cột [A:a] của CSDL;
Như vậy là chọn 1 trong ngàn dòng cũng mệt.
Nếu đó là 1 TextBox thì là chuyện khác; Ta có thể gõ vô đó vài ba kí tự & ấn nút lệnh tìm; Bảo VBA tìm & hiện kết quả lên ListBox
(Nếu dữ liệu nhiều ta nên chọn cách này; Vì không tài thánh nào nhớ hết trong đầu các mã lệnh không ngắn chút nào như vậy.)
mình cũng dùng thử combobox chia làm 8 cột và tham chiếu từ cột A2:H, nếu thỏa mãn kết quả thì các đầu mục sẽ hiện tương ướng với các textbox và chỉnh sửa được nhưng khổ nỗi mình chỉ biết làm cho nó hiện được 1 mã theo thứ tự từ trên xuống, nếu có 2 mã giống nhau 1 mã đã xuất 1 mã chưa thì lại phải lăn chuột tìm chứ không hiện được danh sách như bạn để lựa chọn cái chưa xuất.
 
Upvote 0
Bạn thử với file này & mai cho biết í kiến; Xài TextBox để tìm 1 fần của "Lệnh"
 

File đính kèm

Upvote 0

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

Back
Top Bottom