Chuyên mục xử lý, gỡ rối code VBA (1 người xem)

Liên hệ QC

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

Status
Không mở trả lời sau này.

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,970
Bạn này đang có ý tưởng viết lại hàm của anh Biil. Chỉ có chị "đẹp" mới hỗ trợ được thôi :p
Mình không rãnh để lấy trứng chọi đá.
Hay!, GPE2 nó lại vô tình trùng với địa chỉ của ô GPE2. Sửa nó thành GPE_2 xem, mà cũng chả hiểu hàm của bạn nó làm cái gì nữa.
Topic của nó đây nhé, hiền xem giúp tôi xem, tôi đặt hàm đâu có trùng nhỉ
http://www.giaiphapexcel.com/dienda...vùng-dữ-liệu-không-đầy-đủ.129352/#post-811300
 
Upvote 0
Hay!, GPE2 nó lại vô tình trùng với địa chỉ của ô GPE2. Sửa nó thành GPE_2 xem, mà cũng chả hiểu hàm của bạn nó làm cái gì nữa.
đúng là như thế, rất cảm ơn bạn, đúng thật là hồ đồ quá, sau này đặt hàm sẽ đặt>3 chữ
Mã:
Function Tlookup(Rng As Range, SP As String, Num As Long)
    Dim frng As Range
    Set frng = Rng.Resize(, 1).Find(SP, , xlValues, xlWhole, , , True)(, 2)
    Tlookup = IIf(Num < 1 Or frng(, 2) + 1 < frng + Num, Space(0), frng + Num - 1)
    Set frng = Nothing
End Function
 
Upvote 0
Xin các anh giải đáp giúp em bài toán này với: Khi em làm 1 tool nhỏ để nhập dữ liệu, em có 3 Textbox là 1,2,3 và muốn ghi vào cột A,B,C
Textbox 1 là một chuỗi các ký tự ( chẵn ký tự)
Textbox 2 và 3 là các giá trị cố định
Các anh giúp em code để khi em thao tác nhập dữ liệu thì hệ thống sẽ tự lấy dữ liệu ở Textbox 1 cứ 2 ký tự 1 nó ghi vào 1 dòng của cột A và tương ứng giá trị cố định của Textbox 2 và 3
Ví dụ em nhập
Textbox 1 : abcd1234
Textbox 2: a
Textbox 3: 1
Thì cột A có 4 dòng là ab, cd, 12, 34 và cột B giá trị a, cột C giá trị 1

Em mới tim hiểu nên từ ngữ còn chưa định nghĩa được hết, mong các anh giúp em giải bài này với ạ. Em cảm ơn nhiều !
 
Upvote 0
Xin các anh giải đáp giúp em bài toán này với: Khi em làm 1 tool nhỏ để nhập dữ liệu, em có 3 Textbox là 1,2,3 và muốn ghi vào cột A,B,C
Textbox 1 là một chuỗi các ký tự ( chẵn ký tự)
Textbox 2 và 3 là các giá trị cố định
Các anh giúp em code để khi em thao tác nhập dữ liệu thì hệ thống sẽ tự lấy dữ liệu ở Textbox 1 cứ 2 ký tự 1 nó ghi vào 1 dòng của cột A và tương ứng giá trị cố định của Textbox 2 và 3
Ví dụ em nhập
Textbox 1 : abcd1234
Textbox 2: a
Textbox 3: 1
Thì cột A có 4 dòng là ab, cd, 12, 34 và cột B giá trị a, cột C giá trị 1

Em mới tim hiểu nên từ ngữ còn chưa định nghĩa được hết, mong các anh giúp em giải bài này với ạ. Em cảm ơn nhiều !
Đại khái vầy. Bạn thay [A1] thành ô đầu tiên của vùng ghi dữ liệu.
PHP:
Dim i As Long, KetQua As Variant
ReDim KetQua(1 To Len(Textbox1.Value) \ 2, 1 To 3)
For i = 1 To UBound(KetQua, 1)
    KetQua(i, 1) = Mid(Textbox1.Value, (i - 1) * 2 + 1, 2)
    KetQua(i, 2) = Textbox2.Value
    KetQua(i, 3) = Textbox3.Value
Next
[A1].Resize(UBound(KetQua, 1), 3).Value = KetQua
 
Upvote 0
Đại khái vầy. Bạn thay [A1] thành ô đầu tiên của vùng ghi dữ liệu.
PHP:
Dim i As Long, KetQua As Variant
ReDim KetQua(1 To Len(Textbox1.Value) \ 2, 1 To 3)
For i = 1 To UBound(KetQua, 1)
    KetQua(i, 1) = Mid(Textbox1.Value, (i - 1) * 2 + 1, 2)
    KetQua(i, 2) = Textbox2.Value
    KetQua(i, 3) = Textbox3.Value
Next
[A1].Resize(UBound(KetQua, 1), 3).Value = KetQua
Anh Huu Thang xử lý nhanh thật.
 
Upvote 0
Chào mọi người, em muốn hỏi 1 chút về việc chèn số liệu từ textbox vào 1 sheet trong excel thỏa mãn điều kiện trong listbox như sau.
Ở Sheet1 em có 1 list các ngày từ 1/9 đến 31/9
Em có 1 userform gồm : 1 Combobox và 1 textbox.
Combobox lấy list từ Sheet1!A4:A34
Textbox là dữ liệu mình muốn thêm vào
Giờ em muốn là sau khi chọn ngày, ví dụ ngày 4/9 ở Combobox
Textbox là nhập 1 số liệu nào đó thì.
Ở Sheet2 sẽ điền số liệu vào cột B7 có điều kiện là ở cột A7 (ở đây 4 tương đương với ngày 4/9, từ 1 đến 31 sẽ tương đương với ngày từ 1/9 đến 31/9)
 

File đính kèm

Upvote 0
Chào mọi người, em muốn hỏi 1 chút về việc chèn số liệu từ textbox vào 1 sheet trong excel thỏa mãn điều kiện trong listbox như sau.
Ở Sheet1 em có 1 list các ngày từ 1/9 đến 31/9
Em có 1 userform gồm : 1 Combobox và 1 textbox.
Combobox lấy list từ Sheet1!A4:A34
Textbox là dữ liệu mình muốn thêm vào
Giờ em muốn là sau khi chọn ngày, ví dụ ngày 4/9 ở Combobox
Textbox là nhập 1 số liệu nào đó thì.
Ở Sheet2 sẽ điền số liệu vào cột B7 có điều kiện là ở cột A7 (ở đây 4 tương đương với ngày 4/9, từ 1 đến 31 sẽ tương đương với ngày từ 1/9 đến 31/9)
Bạn dùng Code sau cho Form
Mã:
Private Sub CommandButton1_Click()
    Range("B" & ComboBox1.ListIndex + 4) = TextBox1
End Sub
 
Upvote 0
Bạn dùng Code sau cho Form
Mã:
Private Sub CommandButton1_Click()
    Range("B" & ComboBox1.ListIndex + 4) = TextBox1
End Sub
Cái hàm Range là với Sheet2 hiện thời đang mở, nhưng khi có nhiều sheet và active sheet không phải là sheet2 thì thêm cái gì vào trước Range được ạ ?
Workbook("Sheet2").Range phải không ạ ?
Với em giờ không muốn đặt theo tên Sheet nữa mà muốn đặt theo tên cố định của Sheet nhìn thấy khi trong cửa sổ VBA thì phải làm thế nào ạ, vd như Sheet2 đổi tên thành abc, nhưng trong VBA thì nó vẫn nhận là Sheet2 ý ạ .
Em xin cảm ơn!
 
Upvote 0
Cái hàm Range là với Sheet2 hiện thời đang mở, nhưng khi có nhiều sheet và active sheet không phải là sheet2 thì thêm cái gì vào trước Range được ạ ?
Workbook("Sheet2").Range phải không ạ ?
Với em giờ không muốn đặt theo tên Sheet nữa mà muốn đặt theo tên cố định của Sheet nhìn thấy khi trong cửa sổ VBA thì phải làm thế nào ạ, vd như Sheet2 đổi tên thành abc, nhưng trong VBA thì nó vẫn nhận là Sheet2 ý ạ .
Em xin cảm ơn!
Cấu trúc này thì dạng nó là:
Mã:
Sheets("Tên sheet").Range

Sheet1.Range (Trong đó cái Sheet1 là cái bạn nhìn trong cửa sổ VBE
 
Upvote 0
Vâng, vì em muốn là dù không may người ta có thay đổi tên của Sheet thì công thức cũng sẽ không bị lỗi
 
Upvote 0
Cấu trúc này thì dạng nó là:
Mã:
Sheets("Tên sheet").Range

Sheet1.Range (Trong đó cái Sheet1 là cái bạn nhìn trong cửa sổ VBE
Em muốn thêm code check tại textbox1, yêu cầu nhập tại hộp textbox1 phải là số lớn hơn 0 thì thêm đoạn code nào vào được ạ ?
 
Upvote 0
Đại khái vầy. Bạn thay [A1] thành ô đầu tiên của vùng ghi dữ liệu.
PHP:
Dim i As Long, KetQua As Variant
ReDim KetQua(1 To Len(Textbox1.Value) \ 2, 1 To 3)
For i = 1 To UBound(KetQua, 1)
    KetQua(i, 1) = Mid(Textbox1.Value, (i - 1) * 2 + 1, 2)
    KetQua(i, 2) = Textbox2.Value
    KetQua(i, 3) = Textbox3.Value
Next
[A1].Resize(UBound(KetQua, 1), 3).Value = KetQua

Anh Hữu Thắng ơi em muốn hoi thêm 1 chút nữa được không ạ
Em muốn thêm 1 vài dòng định nghĩa cho cái textbox1 khi em có nhiều ô giá trị giống nhau
ví dụ em điền a1 vào ô textbox 1 thì vba sẽ tính nó là "112211221122"
a2 vào textbox 1 vba sẽ tính nó là "ssbbccgghh"
a3 vào textbox 1 vba sẽ tính nó là "sgsbbgccggghgh" chẳng hạn
 
Upvote 0
Anh Hữu Thắng ơi em muốn hoi thêm 1 chút nữa được không ạ
Em muốn thêm 1 vài dòng định nghĩa cho cái textbox1 khi em có nhiều ô giá trị giống nhau
ví dụ em điền a1 vào ô textbox 1 thì vba sẽ tính nó là "112211221122"
a2 vào textbox 1 vba sẽ tính nó là "ssbbccgghh"
a3 vào textbox 1 vba sẽ tính nó là "sgsbbgccggghgh" chẳng hạn
Bạn thử vầy thử xem. Tôi làm chay nên cũng không biết có lỗi gì không.
PHP:
Dim i As Long, KetQua As Variant, sTextbox1 As String
sTextbox1 = Textbox1.Value
Select Case sTextbox1
Case "a1"
    sTextbox1 = "112211221122"
Case "a2"
    sTextbox1 = "ssbbccgghh"
Case "a3"
    sTextbox1 = "sgsbbgccggghgh"
End Select
ReDim KetQua(1 To Len(sTextbox1) \ 2, 1 To 3)
For i = 1 To UBound(KetQua, 1)
    KetQua(i, 1) = Mid(sTextbox1, (i - 1) * 2 + 1, 2)
    KetQua(i, 2) = Textbox2.Value
    KetQua(i, 3) = Textbox3.Value
Next
[A1].Resize(UBound(KetQua, 1), 3).Value = KetQua
 
Upvote 0
Nhờ các bạn chỉ giúp!
Ban đầu mình có một vùng dữ liệu từ ô B2:F15 và đã đặt tên là MAINDATA (đây là vùng dữ liệu động, vùng này sẽ thay đổi vị trí mỗi khi kết qua tính toán thay đổi, nhưng số lượng của hàng và cột không đổi) Mình muốn gán một biến cho vùng này qua tên đã đặt, chứ không qua địa chỉ hàng/cột như trên. Để cho dù là bất cứ kết quả nào thì vẫn chỉ là vùng MAINDATA mà thôi.
Mình đang chỉ dùng được cách: "Set rng = Range("B2:F15")". nhưng khi dùng "Set rng = Range("MAINDATA")" thì không được. Do vậy, khi kết quả thay đổi thì đoạn code cũng đi tong luôn.
Các bạn chỉ giúp minh cách gán biến 'rng' cho vùng dữ liệu MAINDATA này với.
 
Upvote 0
Nhờ các bạn chỉ giúp!
Ban đầu mình có một vùng dữ liệu từ ô B2:F15 và đã đặt tên là MAINDATA (đây là vùng dữ liệu động, vùng này sẽ thay đổi vị trí mỗi khi kết qua tính toán thay đổi, nhưng số lượng của hàng và cột không đổi) Mình muốn gán một biến cho vùng này qua tên đã đặt, chứ không qua địa chỉ hàng/cột như trên. Để cho dù là bất cứ kết quả nào thì vẫn chỉ là vùng MAINDATA mà thôi.
Mình đang chỉ dùng được cách: "Set rng = Range("B2:F15")". nhưng khi dùng "Set rng = Range("MAINF")" thì không được. Do vậy, khi kết quả thay đổi thì đoạn code cũng đi tong luôn.
Các bạn chỉ giúp minh với.
Vì sao bạn không làm cách này?
PHP:
Set rng = Range("B2:F15")
 
Upvote 0
Nếu scope của name là worksheet thì chỉ khi nào sheet ấy đang active mới sử dụng được.
 
Upvote 0
Vào name manager, xét lại xem scope của nó là cái gì.
Nếu không phải là workbook thì sửa lại. Hình như nó khong cho sửa scope, chỉ có xoá đi và tạo lại cái khác
 
Upvote 0
e có file kết quả , nhưng nó không tự up date được dữ liệu của ngày sau , anh chị nào giúp em sửa lỗi không ạ ?
 
Upvote 0
Chào anh/chị,

Em vừa tìm hiểu VBA nên có nhiều thứ không biết. Cho em hỏi em muốn so sánh giá trị số của 2 textbox thì em dùng hàm gì ạ?

Ví dụ: em có textbox1, và textbox2 em muốn viết hàm

if textbox1 >textbox2 then
.......
em muốn trả textbox1 và textbox2 về dạng số để so sánh.

Cám ơn anh chị.
 
Upvote 0
Các bác giúp em gộp 2 sự kiện này được không ạ, em muốn thêm 1 sự kiện là AutoFit Row với Merge Cells mà không chỉ chạy được 1 cái
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$C$1" Then Exit Sub
Dim Rng  As Range
On Error Resume Next
Set Rng = Sheet3.Range("B3:B" & Sheet3.[C65500].End(xlUp).Row).Find(Range("C1").Value, , , xlWhole)
If Not Rng Is Nothing Then
Range(Range("D1").Value).Value = Sheet13.[D10] & ", ngày " & Left(Sheet3.Range("G" & Rng.Row).Value, 2) & " tháng " & Mid(Sheet3.Range("G" & Rng.Row).Value, 4, 2) & " n" & ChrW(259) & "m " & Right(Sheet3.Range("G" & Rng.Row).Value, 4)   'Ngay NT (chu)
Range(Range("D2").Value).Value = "S" & ChrW(7888) & ": " & Sheet3.Range("A" & Rng.Row).Value & "/TN" & ChrW(272) & "V" 'So TNDV
Range(Range("D3").Value).Value = "     " & Sheet3.[D1] & ": " & Sheet3.Range("D" & Rng.Row).Value 'Hang muc
Range(Range("D4").Value).Value = "     " & Sheet3.[C1] & ": " & Sheet3.Range("C" & Rng.Row).Value 'Ten doi tuong lay mau
Range(Range("D5").Value).Value = Sheet3.Range("E" & Rng.Row).Value 'Nguon vat tu
End If
Set Rng = Nothing
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim NewRwHt As Single
Dim cWdth As Single, MrgeWdth As Single
Dim c As Range, cc As Range
Dim ma As Range
With Target
If .MergeCells And .WrapText Then
Set c = Target.Cells(1, 1)
cWdth = c.ColumnWidth
Set ma = c.MergeArea
For Each cc In ma.Cells
MrgeWdth = MrgeWdth + cc.ColumnWidth
Next
Application.ScreenUpdating = False
ma.MergeCells = False
c.ColumnWidth = MrgeWdth
c.EntireRow.AutoFit
NewRwHt = c.RowHeight
c.ColumnWidth = cWdth
ma.MergeCells = True
ma.RowHeight = NewRwHt
cWdth = 0: MrgeWdth = 0
Application.ScreenUpdating = True
End If
End With
End Sub
 
Upvote 0
Các bác giúp em gộp 2 sự kiện này được không ạ, em muốn thêm 1 sự kiện là AutoFit Row với Merge Cells mà không chỉ chạy được 1 cái
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$C$1" Then Exit Sub
Dim Rng  As Range
On Error Resume Next
Set Rng = Sheet3.Range("B3:B" & Sheet3.[C65500].End(xlUp).Row).Find(Range("C1").Value, , , xlWhole)
If Not Rng Is Nothing Then
Range(Range("D1").Value).Value = Sheet13.[D10] & ", ngày " & Left(Sheet3.Range("G" & Rng.Row).Value, 2) & " tháng " & Mid(Sheet3.Range("G" & Rng.Row).Value, 4, 2) & " n" & ChrW(259) & "m " & Right(Sheet3.Range("G" & Rng.Row).Value, 4)   'Ngay NT (chu)
Range(Range("D2").Value).Value = "S" & ChrW(7888) & ": " & Sheet3.Range("A" & Rng.Row).Value & "/TN" & ChrW(272) & "V" 'So TNDV
Range(Range("D3").Value).Value = "     " & Sheet3.[D1] & ": " & Sheet3.Range("D" & Rng.Row).Value 'Hang muc
Range(Range("D4").Value).Value = "     " & Sheet3.[C1] & ": " & Sheet3.Range("C" & Rng.Row).Value 'Ten doi tuong lay mau
Range(Range("D5").Value).Value = Sheet3.Range("E" & Rng.Row).Value 'Nguon vat tu
End If
Set Rng = Nothing
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim NewRwHt As Single
Dim cWdth As Single, MrgeWdth As Single
Dim c As Range, cc As Range
Dim ma As Range
With Target
If .MergeCells And .WrapText Then
Set c = Target.Cells(1, 1)
cWdth = c.ColumnWidth
Set ma = c.MergeArea
For Each cc In ma.Cells
MrgeWdth = MrgeWdth + cc.ColumnWidth
Next
Application.ScreenUpdating = False
ma.MergeCells = False
c.ColumnWidth = MrgeWdth
c.EntireRow.AutoFit
NewRwHt = c.RowHeight
c.ColumnWidth = cWdth
ma.MergeCells = True
ma.RowHeight = NewRwHt
cWdth = 0: MrgeWdth = 0
Application.ScreenUpdating = True
End If
End With
End Sub
Mình đang đoán là bạn căn dòng của biên bản nghiệm thu vật liệu, hoặc biên bản lấy mẫu vật liệu gì đó. Nhưng bạn tung hỏa mù thế này thì có trời mới giúp được. Tốt nhất bạn lập Topic mới đính kèm file và nói yêu cầu vướng mắc thì sẽ nhanh có kết quả thôi. :p
 
Upvote 0
mình có tạo một form nhập liệu chọn ô nhập liệu là combobox thì có lựa chọn nào để nếu nhập không đúng giá trị mình đã chọn trước ở rowsource thì chương trình sẽ báo lỗi không cho nhập tiếp không mọi người.
 
Upvote 0
Xin nhờ các bác hướng dẫn với ạ. (Em xin sửa lại cho dễ hiểu hơn)
Em có 1 file excel như trên nhờ các bác giúp em tạo 1 module với.
1. Vba loại bỏ các trường hợp trùng sau đó và bắt đầu ghi vào dòng thứ 3 cột K (như trong ví dụ sẽ là 1A - 1B - 1D - 1E - 2C - 2E vào các dòng liên tiếp của cột K)

2. Phần công thức:
Giá trị của cột A sẽ là những ký tự chẵn gồm 4 ký tự, 6 ký tự hoặc 8 ký tự. Trong quá trình tính toán vba sẽ tách nó ra làm từng giá trị = 2 ký tự một liền nhau liên tiếp

giá trị x1 : tương ứng ô ở cột A sẽ có 4 ký tự
giá trị x2: tương ứng ô ở cột A sẽ có 6 ký tự
giá trị x3: tương ứng ô ở cột A sẽ có 8 ký tự
giá trị x4: tương ứng ô ở cột A sẽ có 6 ký tự
giá trị x5: tương ứng ô ở cột A sẽ có 8 ký tự

Em muốn tính giá trị cột E bằng các điều kiện sau:

---- Nếu giá trị ô ở cột C= giá trị "x1" thì ta so sánh giá trị ô ở cột A ( như định nghĩa cột A tách ra làm 2 giá trị) với cột F (Cố định từ F2 - F10)
+ Nếu cả 2 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*2,
+ Phần còn lại thì cho giá trị ô ở cột E = tương ứng ở cột B*1 (tức là có ít nhất 1 giá trị không thuộc F)

----Nếu giá trị ô ở cột C = giá trị "x2" thì ta so sánh giá trị ô ở cột A ( như định nghĩa cột A tách ra làm 3 giá trị) với cột F (Cố định từ F2 - F10)
+ Nếu cả 3 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*3
+ Phần còn lại thì cho giá trị ô ở cột E = tương ứng ở cột B*1.( Tức là có ít nhất 1 giá trị không thuộc F).

---- Nếu giá trị ô ở cột C = giá trị "x3" thì ta so sánh giá trị ô ở cột A ( như định nghĩa cột A tách ra làm 4 giá trị) với cột F (Cố định từ F2 - F10)
+ Nếu cả 4 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*4
+ Phần còn lại thì cho giá trị ô ở cột E = tương ứng ở cột B*1.( Tức là có ít nhất 1 giá trị không thuộc F).

---- Nếu giá trị ô ở cột C = giá trị "x4" thì ta so sánh giá trị ô ở cột A ( như định nghĩa cột A tách ra làm 3 giá trị) với cột F (Cố định từ F2 - F10)
+ Nếu cả 3 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*6
+ Nếu 2 trong 3 giá trị đó nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*2
+ Còn lại thì cho giá trị ô ở cột E = tương ứng ở cột B*1

---- Nếu giá trị ô ở cột C = giá trị "x5" thì ta so sánh giá trị ô ở cột A ( như định nghĩa cột A tách ra làm 4 giá trị) với cột F (Cố định từ F2 - F10)
+ Nếu cả 4 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*9
+ Nếu 3 trong 4 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*6
+ Nếu 2 trong 4 giá trị đó nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*2
+ Còn lại thì cho giá trị ô ở cột E = tương ứng ở cột B*1

Em không biết tóm tắt sao nên viết hơi dài dòng :D mong các anh giúp đỡ ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Em không biết tóm tắt sao nên viết hơi dài dòng :D mong các anh giúp đỡ ạ
Thông thường viết dài (chi tiết) thì sẽ dễ hiểu nhưng bạn viết dài tôi đọc cũng không hiểu. Chắc tại khả năng đọc hiểu của tôi có vấn đề.
 
Upvote 0
Thông thường viết dài (chi tiết) thì sẽ dễ hiểu nhưng bạn viết dài tôi đọc cũng không hiểu. Chắc tại khả năng đọc hiểu của tôi có vấn đề.
Ý em là muốn tính giá trị của cột E phụ thuộc vào các điều kiện tương ứng ấy ạ. Ví dụ tính giá trị ô E2 thì phụ thuộc vào các giá trị ô A2,B2,C2,D2 và giá trị $F$2:$F$7 như trong phần giải thích ạ
 
Upvote 0
Em sửa như ở trên liệu có dễ hiểu hơn không ạ
 
Upvote 0
Tôi không hiểu bạn muốn gì sao mà giúp. Bây giờ file cũng không có.
 
Upvote 0
Mình đang tìm kiếm code mẫu cách tính Nhập -xuất -Tôn ............... chung nhất nghiên cứu mà chưa thấy ... bạn nào thấy ở link nào chỉ dùm ... xin cảm ơn
 
Upvote 0
Tôi không hiểu bạn muốn gì sao mà giúp. Bây giờ file cũng không có.
Em xin lỗi anh huuthang_bd, em đã chỉnh sửa lại nội dung hỗ trợ và up lại file nhưng không hiểu sao không được, em up lại file mong anh giúp đỡ em ạ !

1. Vba loại bỏ các trường hợp trùng sau đó và bắt đầu ghi vào dòng thứ 3 cột K (như trong ví dụ sẽ là 1A - 1B - 1D - 1E - 2C - 2E vào các dòng liên tiếp của cột K)

2. Phần công thức:
Giá trị của cột A sẽ là những ký tự chẵn gồm 4 ký tự, 6 ký tự hoặc 8 ký tự. Trong quá trình tính toán vba sẽ tách nó ra làm từng giá trị = 2 ký tự một liền nhau liên tiếp

giá trị x1 : tương ứng ô ở cột A sẽ có 4 ký tự
giá trị x2: tương ứng ô ở cột A sẽ có 6 ký tự
giá trị x3: tương ứng ô ở cột A sẽ có 8 ký tự
giá trị x4: tương ứng ô ở cột A sẽ có 6 ký tự
giá trị x5: tương ứng ô ở cột A sẽ có 8 ký tự

Em muốn tính giá trị cột E bằng các điều kiện sau:

---- Nếu giá trị ô ở cột C= giá trị "x1" thì ta so sánh giá trị ô ở cột A ( như định nghĩa cột A tách ra làm 2 giá trị) với cột F (Cố định từ F2 - F10)
+ Nếu cả 2 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*2,
+ Phần còn lại thì cho giá trị ô ở cột E = tương ứng ở cột B*1 (tức là có ít nhất 1 giá trị không thuộc F)

----Nếu giá trị ô ở cột C = giá trị "x2" thì ta so sánh giá trị ô ở cột A ( như định nghĩa cột A tách ra làm 3 giá trị) với cột F (Cố định từ F2 - F10)
+ Nếu cả 3 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*3
+ Phần còn lại thì cho giá trị ô ở cột E = tương ứng ở cột B*1.( Tức là có ít nhất 1 giá trị không thuộc F).

---- Nếu giá trị ô ở cột C = giá trị "x3" thì ta so sánh giá trị ô ở cột A ( như định nghĩa cột A tách ra làm 4 giá trị) với cột F (Cố định từ F2 - F10)
+ Nếu cả 4 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*4
+ Phần còn lại thì cho giá trị ô ở cột E = tương ứng ở cột B*1.( Tức là có ít nhất 1 giá trị không thuộc F).

---- Nếu giá trị ô ở cột C = giá trị "x4" thì ta so sánh giá trị ô ở cột A ( như định nghĩa cột A tách ra làm 3 giá trị) với cột F (Cố định từ F2 - F10)
+ Nếu cả 3 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*6
+ Nếu 2 trong 3 giá trị đó nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*2
+ Còn lại thì cho giá trị ô ở cột E = tương ứng ở cột B*1

---- Nếu giá trị ô ở cột C = giá trị "x5" thì ta so sánh giá trị ô ở cột A ( như định nghĩa cột A tách ra làm 4 giá trị) với cột F (Cố định từ F2 - F10)
+ Nếu cả 4 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*9
+ Nếu 3 trong 4 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*6
+ Nếu 2 trong 4 giá trị đó nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*2
+ Còn lại thì cho giá trị ô ở cột E = tương ứng ở cột B*1
 

File đính kèm

Upvote 0
Em xin lỗi anh huuthang_bd, em đã chỉnh sửa lại nội dung hỗ trợ và up lại file nhưng không hiểu sao không được, em up lại file mong anh giúp đỡ em ạ !

1. Vba loại bỏ các trường hợp trùng sau đó và bắt đầu ghi vào dòng thứ 3 cột K (như trong ví dụ sẽ là 1A - 1B - 1D - 1E - 2C - 2E vào các dòng liên tiếp của cột K)

2. Phần công thức:
Giá trị của cột A sẽ là những ký tự chẵn gồm 4 ký tự, 6 ký tự hoặc 8 ký tự. Trong quá trình tính toán vba sẽ tách nó ra làm từng giá trị = 2 ký tự một liền nhau liên tiếp

giá trị x1 : tương ứng ô ở cột A sẽ có 4 ký tự
giá trị x2: tương ứng ô ở cột A sẽ có 6 ký tự
giá trị x3: tương ứng ô ở cột A sẽ có 8 ký tự
giá trị x4: tương ứng ô ở cột A sẽ có 6 ký tự
giá trị x5: tương ứng ô ở cột A sẽ có 8 ký tự

Em muốn tính giá trị cột E bằng các điều kiện sau:

---- Nếu giá trị ô ở cột C= giá trị "x1" thì ta so sánh giá trị ô ở cột A ( như định nghĩa cột A tách ra làm 2 giá trị) với cột F (Cố định từ F2 - F10)
+ Nếu cả 2 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*2,
+ Phần còn lại thì cho giá trị ô ở cột E = tương ứng ở cột B*1 (tức là có ít nhất 1 giá trị không thuộc F)

----Nếu giá trị ô ở cột C = giá trị "x2" thì ta so sánh giá trị ô ở cột A ( như định nghĩa cột A tách ra làm 3 giá trị) với cột F (Cố định từ F2 - F10)
+ Nếu cả 3 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*3
+ Phần còn lại thì cho giá trị ô ở cột E = tương ứng ở cột B*1.( Tức là có ít nhất 1 giá trị không thuộc F).

---- Nếu giá trị ô ở cột C = giá trị "x3" thì ta so sánh giá trị ô ở cột A ( như định nghĩa cột A tách ra làm 4 giá trị) với cột F (Cố định từ F2 - F10)
+ Nếu cả 4 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*4
+ Phần còn lại thì cho giá trị ô ở cột E = tương ứng ở cột B*1.( Tức là có ít nhất 1 giá trị không thuộc F).

---- Nếu giá trị ô ở cột C = giá trị "x4" thì ta so sánh giá trị ô ở cột A ( như định nghĩa cột A tách ra làm 3 giá trị) với cột F (Cố định từ F2 - F10)
+ Nếu cả 3 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*6
+ Nếu 2 trong 3 giá trị đó nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*2
+ Còn lại thì cho giá trị ô ở cột E = tương ứng ở cột B*1

---- Nếu giá trị ô ở cột C = giá trị "x5" thì ta so sánh giá trị ô ở cột A ( như định nghĩa cột A tách ra làm 4 giá trị) với cột F (Cố định từ F2 - F10)
+ Nếu cả 4 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*9
+ Nếu 3 trong 4 nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*6
+ Nếu 2 trong 4 giá trị đó nằm trong giá trị của cột F thì cho giá trị ô ở cột E = tương ứng ở cột B*2
+ Còn lại thì cho giá trị ô ở cột E = tương ứng ở cột B*1
Công thức mảng cho ô E2
Mã:
=(SUM(LARGE(COUNTIF($F$2:$F$10,MID(A2,ROW($A$1:$A$4)*2-1,2)),ROW($A$1:$A$4))*IF(--RIGHT(D2)<4,{0;1;1;1},{0;1;4;3}))+1)*B2
Và code cho cột K
PHP:
Sub Button1_Click()
Dim Arr As Variant
Arr = UniqueAndSort(Range("C2:C" & Cells(&H100000, 3).End(xlUp).Row))
Range("K3").Resize(UBound(Arr, 1)).Value = Arr
End Sub
PHP:
Private Function UniqueAndSort(ByVal Rng As Variant) As Variant
Dim i As Long, j As Long, Dic As Object, Arr As Variant, ResultArr() As String, Pos As Long
Set Dic = CreateObject("Scripting.Dictionary")
If Rng.Count = 1 Then
    ReDim ResultArr(1 To 1, 1 To 1)
    ResultArr(1, 1) = Rng.Value
Else
    Arr = Rng.Value
    For i = 1 To UBound(Arr, 1)
        Dic.Item(Arr(i, 1)) = ""
    Next
    Arr = Dic.Keys
    ReDim ResultArr(1 To Dic.Count, 1 To 1)
    Dic.RemoveAll
    For i = LBound(Arr, 1) To UBound(Arr, 1)
        Pos = i
        For j = i + 1 To UBound(Arr, 1)
            If Arr(j) < Arr(Pos) Then Pos = j
        Next
        ResultArr(i + 1, 1) = Arr(Pos)
        Arr(Pos) = Arr(i)
    Next
End If
UniqueAndSort = ResultArr
End Function
 
Upvote 0
Công thức mảng cho ô E2
Mã:
=(SUM(LARGE(COUNTIF($F$2:$F$10,MID(A2,ROW($A$1:$A$4)*2-1,2)),ROW($A$1:$A$4))*IF(--RIGHT(D2)<4,{0;1;1;1},{0;1;4;3}))+1)*B2
Và code cho cột K
PHP:
Sub Button1_Click()
Dim Arr As Variant
Arr = UniqueAndSort(Range("C2:C" & Cells(&H100000, 3).End(xlUp).Row))
Range("K3").Resize(UBound(Arr, 1)).Value = Arr
End Sub
PHP:
Private Function UniqueAndSort(ByVal Rng As Variant) As Variant
Dim i As Long, j As Long, Dic As Object, Arr As Variant, ResultArr() As String, Pos As Long
Set Dic = CreateObject("Scripting.Dictionary")
If Rng.Count = 1 Then
    ReDim ResultArr(1 To 1, 1 To 1)
    ResultArr(1, 1) = Rng.Value
Else
    Arr = Rng.Value
    For i = 1 To UBound(Arr, 1)
        Dic.Item(Arr(i, 1)) = ""
    Next
    Arr = Dic.Keys
    ReDim ResultArr(1 To Dic.Count, 1 To 1)
    Dic.RemoveAll
    For i = LBound(Arr, 1) To UBound(Arr, 1)
        Pos = i
        For j = i + 1 To UBound(Arr, 1)
            If Arr(j) < Arr(Pos) Then Pos = j
        Next
        ResultArr(i + 1, 1) = Arr(Pos)
        Arr(Pos) = Arr(i)
    Next
End If
UniqueAndSort = ResultArr
End Function

Anh ơi có lẽ em giải thích anh lại hiểu sai ý em :D ý em là các ký tự ở ô ở cột A em sẽ phải tách ra làm 2 ký tự
ví dụ A2 sẽ là AA , BB và so sánh với giá trị cột F
A3 sẽ là BB,CC,DD
A4 sẽ là 1A,B3,D8,K9
từ đó dựa vào các điều kiện trong các ô tương ứng để tính ra giá trị trong các ô E2 , E3 , E4 ....
 
Upvote 0
Anh ơi có lẽ em giải thích anh lại hiểu sai ý em :D ý em là các ký tự ở ô ở cột A em sẽ phải tách ra làm 2 ký tự
ví dụ A2 sẽ là AA , BB và so sánh với giá trị cột F
A3 sẽ là BB,CC,DD
A4 sẽ là 1A,B3,D8,K9
từ đó dựa vào các điều kiện trong các ô tương ứng để tính ra giá trị trong các ô E2 , E3 , E4 ....
Thì tôi làm vậy. Sai chỗ nào? Chú ý đọc kỹ hướng dẫn của tôi, chỗ nào cần nhấn tôi cũng đã nhấn rồi.
 
Upvote 0
Anh ơi có lẽ em giải thích anh lại hiểu sai ý em :D ý em là các ký tự ở ô ở cột A em sẽ phải tách ra làm 2 ký tự
ví dụ A2 sẽ là AA , BB và so sánh với giá trị cột F
A3 sẽ là BB,CC,DD
A4 sẽ là 1A,B3,D8,K9
từ đó dựa vào các điều kiện trong các ô tương ứng để tính ra giá trị trong các ô E2 , E3 , E4 ....
Có sửa lại công thức một chút.
 

File đính kèm

Upvote 0
Nhờ các thầy và các anh em giúp đỡ, CODE trong File Excel này vướng chỗ nào mà em chạy không được.

Option Explicit

Type LoaiVatTu
MaSo As String
Ten As String
DonVi As String
KhoiLuong As Double
End Type

Public Sub DanhSachVatTu()
Dim R As Range 'Pham vi trong BANG VAT LIEU can phan tich vat tu
Dim DanhSachVT() As LoaiVatTu ' Mang dong chua danh sach vat tu
Dim i As Long ' Chi so Mang dong
Dim k As Long ' Bien nay dung de duyet bang du lieu trong R

'chon vung du lieu can tinh TONG HOP VAT TU
Set R = Application.InputBox("Chon vung du lieu can tong hop vat tu", Type:=8)

i = 0 'chi so dau tien cua Mang vat tu la 0

Dim ii As Long
Dim ok As Boolean

'Doc du lieu tu sheet "Phan tich vat tu"
For Each k In R.Columns(1).Cells 'Chay qua tung o cua cot R

If Trim(k.Value) <> "" Then ' Trim la de cat bo nhung khoang trang trong tung o du lieu
If i = 0 Then ' vat tu dau tien trong danh sach
ReDim Preserve DanhSachVT(i) 'Gan du lieu cho vat tu dau tien
DanhSachVT(i).MaSo = Trim(k.Value)
DanhSachVT(i).Ten = Trim(k.Offset(0, 1).Value)
DanhSachVT(i).DonVi = Trim(k.Offset(0, 2).Value)
DanhSachVT(i).KhoiLuong = k.Offset(0, 3).Value
i = i + 1 ' tang chi so mang len 1
Else ' Neu danh sach vat tu lon hon 1
ok = True
For ii = 0 To i - 1
'vat tu nay da co trong danh sach
If DanhSachVT(ii).MaSo = Trim(k.Value) Then
ok = False
DanhSachVT(ii).KhoiLuong = DanhSachVT(ii).KhoiLuong + k.Offset(0, 3).Value
Exit For
End If
Next ii
'vat tu chua co ten trong danh sach
If ok Then

ReDim Preserve DanhSachVT(i) 'Gan du lieu cho vat tu dau tien
DanhSachVT(i).MaSo = Trim(k.Value)
DanhSachVT(i).Ten = Trim(k.Offset(0, 1).Value)
DanhSachVT(i).DonVi = Trim(k.Offset(0, 2).Value)
DanhSachVT(i).KhoiLuong = k.Offset(0, 3).Value
i = i + 1
End If
End If
End If
Next
'Ghi ket qua ra Excel, trong sheet "Tong hop vat tu"
Dim j As Long
Dim row As Long

row = 1 'Bat dau ghi du lieu tu dong so 1
For j = LBound(DanhSachVT) To UBound(DanhSachVT)
ThisWorkbook.Worksheets("Tong hop vat tu").Cells(row + j, 1).Value = j + 1
ThisWorkbook.Worksheets("Tong hop vat tu").Cells(row + j, 2).Value = DanhSachVT(j).MaSo
ThisWorkbook.Worksheets("Tong hop vat tu").Cells(row + j, 3).Value = DanhSachVT(j).Ten
ThisWorkbook.Worksheets("Tong hop vat tu").Cells(row + j, 4).Value = DanhSachVT(j).DonVi
ThisWorkbook.Worksheets("Tong hop vat tu").Cells(row + j, 5).Value = DanhSachVT(j).KhoiLuong
Next j
MsgBox "Ket thuc"

End Sub
 

File đính kèm

Upvote 0
Đây nữa, Sao em chạy thử mà không được gì cả. Rất mong được mọi người hướng dẫn thêm ạ
 

File đính kèm

Upvote 0
Chào mấy anh/chị

Cho em hỏi mình có code nào để rút ngắn lệnh trên excel không ạ.
Ví dụ như hình bên dưới, em muốn nhấn 1 lệnh là nó ra beetween luôn khỏi phải đi từng bước.
upload_2017-9-22_3-18-29.png
 
Upvote 0
Chào mấy anh/chị

Cho em hỏi, em muốn lọc autofilter ngày tháng như bên dưới, nhưng khi viết thì lúc lọc nó không ra đúng. Anh, Chị nào biết giúp em đoạn code bên dưới với.
Em cảm ơn.

Sub Locngayxuat()
Dim dDate As Date
Dim lDate As Long
If IsDate(Range("$C$8:$Q$1001")) Then
dDate = Range("$C$8:$Q$1001")
lDate = DateSerial(Year(dDate), Month(dDate), Day(dDate))
End If
Range("I6").Select
NgayBD = ActiveCell.Value
Range("K6").Select
NgayKT = ActiveCell.Value
ActiveSheet.Range("$C$8:$Q$1001").AutoFilter Field:=2, Criteria1:=">=NgayBD" & lDate, Operator:=xlAnd, Criteria2:="<=NgayKT" & lDate
End Sub
 

File đính kèm

Upvote 0
Vậy chắc là lúc nãy nó bị xung đột cái gì rồi . Bạn xem luôn dùm mình cái file Phân tích vật tư ở phía trên luôn cái. Nó bị lỗi gì mà tìm không ra
Cái Code cũ sửa lại như thế này thì chạy được :p
PHP:
Public Sub DanhSachVatTu()
    Dim R As Range 'Pham vi trong BANG VAT LIEU can phan tich vat tu
    Dim DanhSachVT() As LoaiVatTu  ' Mang dong chua danh sach vat tu
    Dim I As Long  ' Chi so Mang dong
    Dim K As Range  ' Bien nay dung de duyet bang du lieu trong R
    'chon vung du lieu can tinh TONG HOP VAT TU
    Set R = Application.InputBox("Chon vung du lieu can tong hop vat tu", Type:=8)
    I = 0 'chi so dau tien cua Mang vat tu la 0
    Dim ii As Long
    Dim ok As Boolean
    'Doc du lieu tu sheet "Phan tich vat tu"
    For Each K In R.Columns(1).Cells           'Chay qua tung o cua cot R
        If Trim(K.Value) <> "" Then   ' Trim la de cat bo nhung khoang trang trong tung o du lieu
            If I = 0 Then ' vat tu dau tien trong danh sach
                ReDim Preserve DanhSachVT(I) 'Gan du lieu cho vat tu dau tien
                DanhSachVT(I).MaSo = Trim(K.Value)
                DanhSachVT(I).Ten = Trim(K.Offset(0, 1).Value)
                DanhSachVT(I).DonVi = Trim(K.Offset(0, 2).Value)
                DanhSachVT(I).KhoiLuong = K.Offset(0, 3).Value
                I = I + 1      ' tang chi so mang len 1
                Else  ' Neu danh sach vat tu lon hon 1
                ok = True
                For ii = 0 To I - 1
                    'vat tu nay da co trong danh sach
                    If DanhSachVT(ii).MaSo = Trim(K.Value) Then
                        ok = False
                        DanhSachVT(ii).KhoiLuong = DanhSachVT(ii).KhoiLuong + K.Offset(0, 3).Value
                        Exit For
                    End If
                Next ii
                'vat tu chua co ten trong danh sach
                If ok Then
                    ReDim Preserve DanhSachVT(I) 'Gan du lieu cho vat tu dau tien
                    DanhSachVT(I).MaSo = Trim(K.Value)
                    DanhSachVT(I).Ten = Trim(K.Offset(0, 1).Value)
                    DanhSachVT(I).DonVi = Trim(K.Offset(0, 2).Value)
                    DanhSachVT(I).KhoiLuong = K.Offset(0, 3).Value
                    I = I + 1
                End If
            End If
        End If
    Next
    'Ghi ket qua ra Excel, trong sheet "Tong hop vat tu"
    Dim J As Long
    Dim row As Long
    row = 3 'Bat dau ghi du lieu tu dong so 1
    For J = LBound(DanhSachVT) To UBound(DanhSachVT)
        Sheet2.Cells(row + J, 1).Value = J + 1
        Sheet2.Cells(row + J, 2).Value = DanhSachVT(J).MaSo
        Sheet2.Cells(row + J, 3).Value = DanhSachVT(J).Ten
        Sheet2.Cells(row + J, 4).Value = DanhSachVT(J).DonVi
        Sheet2.Cells(row + J, 5).Value = DanhSachVT(J).KhoiLuong
    Next J
    MsgBox "Ket thuc"
End Sub

Em góp vui với cái Phân tích vật tư
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Ôi hay quá Pacific ơi, qua chủ đề này giúp mình với
http://www.giaiphapexcel.com/diendan/threads/nhờ-giúp-em-viết-code-vba-tính-cột-thành-tiền-và-link-đơn-giá.129787/page-3
à mà bạn có thể cho mình hỏi thêm chỗ này được không?
Trong cái CODE Tổng hợp vật tư mà bạn góp vui thì nhờ bạn giải thích hộ với, mình còn non nớt quá ...:(
1/ Phần số 1:
[ php] Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Phan tich vat tu")
sArr = .Range(.[C6], .[C65536].End(xlUp)).Resize(, 4).Value
End With [/php ]

2/ Phần số 2:
ReDim dArr(1 To UBound(sArr, 1), 1 To 4)

3/ Phần số 3:
For I = 1 To UBound(sArr, 1)
If sArr(I, 1) <> Empty Then
Tem = sArr(I, 1)
If Not Dic.Exists(Tem) Then
K = K + 1
Dic.Add Tem, K
dArr(K, 1) = Tem: dArr(K, 2) = sArr(I, 2)
dArr(K, 3) = sArr(I, 3): dArr(K, 4) = sArr(I, 4)
Else
dArr(Dic.Item(Tem), 4) = dArr(Dic.Item(Tem), 4) + sArr(I, 4)
End If
End If
Next I
 
Lần chỉnh sửa cuối:
Upvote 0
Em cảm ơn anh lắm lắm, anh quá là pro luôn :D
Trường hợp của bạn thì đoán ý bạn khó hơn việc giải quyết vấn đề.
Ví dụ:
1. Vba loại bỏ các trường hợp trùng sau đó và bắt đầu ghi vào dòng thứ 3 cột K (như trong ví dụ sẽ là 1A - 1B - 1D - 1E - 2C - 2E vào các dòng liên tiếp của cột K)
Nói như thế này thì ai cũng hiểu: Lọc duy nhất cột C sau đó sắp xếp lại và ghi kết quả vào cột K, bắt đầu từ K3.
 
Upvote 0
Trường hợp của bạn thì đoán ý bạn khó hơn việc giải quyết vấn đề.
Ví dụ:

Nói như thế này thì ai cũng hiểu: Lọc duy nhất cột C sau đó sắp xếp lại và ghi kết quả vào cột K, bắt đầu từ K3.

Dạ, em dùng từ ngữ còn rối quá :( Em còn một mong muốn nữa, mong anh giải thích dùm em cái công thức của anh cho nó chọn vẹn ạ

=(SUM(LARGE(COUNTIF($F$2:$F$10,MID(A2,ROW($A$1:$A$4)*2-1,2)),ROW($A$1:$A$4))*IF(--RIGHT(D2)<4,(ROW($A$1:$A$4)=RIGHT(D2)+1)*RIGHT(D2),{0;1;4;3}))

Em chưa hiểu hết logic trong đó, nên mới thắc mắc tại sao lại lấy giá trị MID(A2,ROW($A$1:$A$4)*2-1,2 )hay các số đằng sau nó {0;1;4;3} và nếu thằng D nó ko phải các giá trị x1,x2,x3,x4,x5 mà là bút,vở,sách,bảng thì sẽ thế nào :)) sẽ phải if nó bằng luôn giá trị đó là đc hay phải viết 1 công thức mới. Em cảm ơn anh Thắng nhiều !
 
Upvote 0
Dạ, em dùng từ ngữ còn rối quá :( Em còn một mong muốn nữa, mong anh giải thích dùm em cái công thức của anh cho nó chọn vẹn ạ

=(SUM(LARGE(COUNTIF($F$2:$F$10,MID(A2,ROW($A$1:$A$4)*2-1,2)),ROW($A$1:$A$4))*IF(--RIGHT(D2)<4,(ROW($A$1:$A$4)=RIGHT(D2)+1)*RIGHT(D2),{0;1;4;3}))

Em chưa hiểu hết logic trong đó, nên mới thắc mắc tại sao lại lấy giá trị MID(A2,ROW($A$1:$A$4)*2-1,2 )hay các số đằng sau nó {0;1;4;3} và
Giải thích thì tôi... thua. Cái này tôi nhờ bạn tôi làm giùm đó :D
nếu thằng D nó ko phải các giá trị x1,x2,x3,x4,x5 mà là bút,vở,sách,bảng thì sẽ thế nào :)) sẽ phải if nó bằng luôn giá trị đó là đc hay phải viết 1 công thức mới. Em cảm ơn anh Thắng nhiều !
Thay --RIGHT(D2)RIGHT(D2) thành
Mã:
MATCH(D2,{"Bút","Vở","Sách","Bảng","Thước"})
 
Upvote 0
Em muốn khai báo và chọn mảng từ ô A1 đến ô A1000. Nhờ các cao thủ giải thích cho em với, em bị lỗi gì

Mã:
Sub Mang_Arr1()
    Dim SArr()
    SArr = Range([A6], [A1000]).Select
End Sub
 
Upvote 0
Mã:
Sub Mang_sArr()
    Dim Dic As Object
    Dim sArr(), dArr
    Set Dic = CreateObject("Scripting.Dictionary")
        
    With Sheet1
        
        sArr = .range(.[a6],.[a1000]).End(xlUp)).Resize(,4).value
        
    End With
    
    ReDim dArr(1 To UBound(sArr, 1), 1 To 4)
    
    
End Sub
CODE này cũng bị lỗi chỗ nào nhờ các cao thủ chỉ giáo, em xin cảm ơn
 

File đính kèm

Upvote 0
Mã:
Sub Mang_sArr()
    Dim Dic As Object
    Dim sArr(), dArr
    Set Dic = CreateObject("Scripting.Dictionary")
       
    With Sheet1
       
        sArr = .range(.[a6],.[a1000]).End(xlUp)).Resize(,4).value
       
    End With
   
    ReDim dArr(1 To UBound(sArr, 1), 1 To 4)
   
   
End Sub
CODE này cũng bị lỗi chỗ nào nhờ các cao thủ chỉ giáo, em xin cảm ơn
Dư dấu đóng ngoặc sau [a1000]
 
Upvote 0
Dư dấu đóng ngoặc sau [a1000]
Vậy sau dòng này có nghĩa là gì vậy anh?
Mã:
sArr = .Range(.[C6], .[C65536].End(xlUp)).Resize(, 4).Value

nếu em chuyển thành như thế này thì bị lỗi vì sao?
Mã:
sArr = .Range(.[C6], .[C65536].End(xlUp)).Resize(, 4).select

như thế này nữa
Mã:
sArr = .Range(.[C6], .[C65536].End(xlUp)).select
 
Upvote 0
Vậy sau dòng này có nghĩa là gì vậy anh?
Mã:
sArr = .Range(.[C6], .[C65536].End(xlUp)).Resize(, 4).Value
.[C65536].End(xlUp) tương đương với ô mà khi chọn ô C65536 rồi nhấn Ctrl và phím mũi tên lên.
nếu em chuyển thành như thế này thì bị lỗi vì sao?
Mã:
sArr = .Range(.[C6], .[C65536].End(xlUp)).Resize(, 4).select

như thế này nữa
Mã:
sArr = .Range(.[C6], .[C65536].End(xlUp)).select
Select là phương thức (chọn), không trả về giá trị nên bị lỗi khi gán cho biến sArr.
 
Upvote 0
.[C65536].End(xlUp) tương đương với ô mà khi chọn ô C65536 rồi nhấn Ctrl và phím mũi tên lên.

Select là phương thức (chọn), không trả về giá trị nên bị lỗi khi gán cho biến sArr.
vậy là khi thực hiện dòng lệnh này sẽ trả về giá trị, cụ thể là giá trị bao nhiêu vậy anh?

Mã:
sArr = .Range(.[C6], .[C65536].End(xlUp)).Resize(, 4).Value


.[C6] thì chọn dòng đầu tiên của cột C ---------> đúng không?
.[C65536].End(xlUp) thì chọn dòng cuối cùng chứa dữ liệu của cột C ------->đúng không?
 
Upvote 0
vậy là khi thực hiện dòng lệnh này sẽ trả về giá trị, cụ thể là giá trị bao nhiêu vậy anh?

Mã:
sArr = .Range(.[C6], .[C65536].End(xlUp)).Resize(, 4).Value


.[C6] thì chọn dòng đầu tiên của cột C ---------> đúng không?
.[C65536].End(xlUp) thì chọn dòng cuối cùng chứa dữ liệu của cột C ------->đúng không?
Bạn đang tra khảo tôi đấy à?
 
Upvote 0
Em thực sự không biết mà anh. Ví dụ như File này thì
Mã:
sArr = .Range(.[C6], .[C65536].End(xlUp)).Resize(, 4).Value
sẽ trả về giá trị bao nhiêu, anh chỉ em với
Bác cứ học từ từ thôi. Không nóng vội được đâu. Bây giờ Bác sang Topic Các câu hỏi về mảng đọc rồi Bác sẽ hiểu
Nếu mới đầu thì qua Topic này học căn bản trước đã :p
 
Upvote 0
Mình đọc rồi mà chưa hiểu, Pacific nói dùm chỗ này đi.
Ngay bài 8 Topic các câu hỏi về mảng Thầy NDu đã nói như thế này rồi
Mã:
Ban chỉ cần nhớ điều này:
- Range và mảng không giống nhau
- 1 Range sau khi biến đổi thành mảng thì đó luôn là mảng 2 chiều
- Muốn biến thành mảng 1 chiều phải thêm các công đoạn khác, chẳng hạn dùng For... Next hoặc hàm TRANSPOSE
Do vậy sArr = .Range(.[C6], .[C65536].End(xlUp)).Resize(, 4).Value Thì sArr là mảng
Còn .Range(.[C6], .[C65536].End(xlUp)).Resize(, 4).select là range nếu muốn nó hoạt động được phải làm như bài 972 mà anh befaint đã hướng dẫn
Mã:
Sub test()
    Dim sArr
Set sArr = Range([C6], [C65536].End(xlUp)).Resize(, 4)
sArr.Select
End Sub
 
Upvote 0
Chào mấy anh/chị

Cho em hỏi, em muốn lọc autofilter ngày tháng như bên dưới, nhưng khi viết thì lúc lọc nó không ra đúng. Anh, Chị nào biết giúp em đoạn code bên dưới với.
Em cảm ơn.

Sub Locngayxuat()
Dim dDate As Date
Dim lDate As Long
If IsDate(Range("$C$8:$Q$1001")) Then
dDate = Range("$C$8:$Q$1001")
lDate = DateSerial(Year(dDate), Month(dDate), Day(dDate))
End If
Range("I6").Select
NgayBD = ActiveCell.Value
Range("K6").Select
NgayKT = ActiveCell.Value
ActiveSheet.Range("$C$8:$Q$1001").AutoFilter Field:=2, Criteria1:=">=NgayBD" & lDate, Operator:=xlAnd, Criteria2:="<=NgayKT" & lDate
End Sub
Help giúp em với ạ.
 
Upvote 0
Chào mấy anh/chị

Cho em hỏi, em muốn lọc autofilter ngày tháng như bên dưới, nhưng khi viết thì lúc lọc nó không ra đúng. Anh, Chị nào biết giúp em đoạn code bên dưới với.
Em cảm ơn.

Sub Locngayxuat()
Dim dDate As Date
Dim lDate As Long
If IsDate(Range("$C$8:$Q$1001")) Then
dDate = Range("$C$8:$Q$1001")
lDate = DateSerial(Year(dDate), Month(dDate), Day(dDate))
End If
Range("I6").Select
NgayBD = ActiveCell.Value
Range("K6").Select
NgayKT = ActiveCell.Value
ActiveSheet.Range("$C$8:$Q$1001").AutoFilter Field:=2, Criteria1:=">=NgayBD" & lDate, Operator:=xlAnd, Criteria2:="<=NgayKT" & lDate
End Sub
dùng thử code
Mã:
Sub Locngayxuat()
    ActiveSheet.Range("$C$8:$Q$1001").AutoFilter Field:=2, Criteria1:=">=" & Range("I6").Value, Operator:=xlAnd, Criteria2:="<=" & Range("K6").Value
End Sub
 
Upvote 0
Thưa thầy cho em hỏi về vòng for:
e có 5 sheet tên lần lượt là CD-L1 -:- CD-L5, giờ em lần lượt đánh công thức cộng từ ô O8 sheet2 + 1 với ô O8 của sheet CD-L1; sheet tiếp theo công 1 từ sheet CD-L1 >>> i = 5. code của em sai ko chạy được mong thầy giải thích hướng dẫn em
--------------------------------------
Sub DanhsoSheets()
Dim i As Long
For i = 1 To 5
Sheets("CD-L & i").Select
Range("O8") = "='CD-L1'!O8+i"
Next i
End Sub
 
Upvote 0
Bạn viết hết fép cộng (có cả địa chỉ) ra xem sao?
Ví dụ:
Sheet2.[O8].Value + 1 + Sheets("CD-L1").[O8].Value + . . . .
 
Upvote 0
Thưa thầy cho em hỏi về vòng for:
e có 5 sheet tên lần lượt là CD-L1 -:- CD-L5, giờ em lần lượt đánh công thức cộng từ ô O8 sheet2 + 1 với ô O8 của sheet CD-L1; sheet tiếp theo công 1 từ sheet CD-L1 >>> i = 5. code của em sai ko chạy được mong thầy giải thích hướng dẫn em
--------------------------------------
Bạn thử với cái này xem sao:
PHP:
Sub DanhsoSheets()
    Dim i As Long, ShName As String
On Error Resume Next
For i = 1 To 5
    ShName = "CD-L" & i
    With Sheets(ShName)
        .Select
        .Range("O8") = Sheets("CD-L1").Range("O8") + 1
    End With
Next i
End Sub
Với đoạn Code trên thì mỗi lần chạy thì nó lại lấy ô O8 của Sheets("CD-L1") công thêm 1 đơn vị. Khi mình bấm 2 lần thì O8 của Sheets("CD-L1") bằng 2 và các Sheet tiếp theo làn lượt là 3,4 ... do vậy dẫn đến tên O8 và tên Sheet khác nhau do Code chạy từ 2 lần trở lên
Nếu tên Ô và tên Sheet giống nhau " Sheets("CD-L1"); O8 =1 .: ............" công thêm 1 ) thì bạn thử cái này thử
HTML:
Sub DanhsoSheets1()
    Dim i As Long, ShName As String, Str As String
    On Error Resume Next
    Str = "CD-L"
    For Each Sh In Worksheets
        If Sh.Name Like Str & "*" Then
            With Sh
                .Select
                .Range("O8") = Replace(Sh.Name, Str, "", 1)
            End With
        End If
    Next Sh
End Sub
 
Upvote 0
Public Sub GPE()
Dim Arr(), i As Integer, vArr()
Arr = Range("b2:m" & Range("m65000").End(xlUp).Row).Value
ReDim vArr(1 To UBound(Arr), 1 To 1)
For i = 1 To UBound(Arr)
vArr(i, 1) = Application.Evaluate(Arr(i, 1) & "/" & Arr(i, 12) & "*" & Arr(i, 2)) 'chia 8: 8 day so co dinh trong code luôn'
Next i
Range("d2").Resize(UBound(Arr)) = vArr

End Sub

chao e muốn thêm code này vArr(i, 1) = Application.Evaluate(Arr(i, 1) & "/" & Arr(i, 12) & "*" & Arr(i, 2))/8 số 8 tô màu đó là cố định trong code luôn.

câu @: e mun xai code hàm if cho e xin code hàm if với.

mong mọi người giúp đỡ.
 
Upvote 0
Bạn thử với cái này xem sao:
PHP:
Sub DanhsoSheets()
    Dim i As Long, ShName As String
On Error Resume Next
For i = 1 To 5
    ShName = "CD-L" & i
    With Sheets(ShName)
        .Select
        .Range("O8") = Sheets("CD-L1").Range("O8") + 1
    End With
Next i
End Sub
Với đoạn Code trên thì mỗi lần chạy thì nó lại lấy ô O8 của Sheets("CD-L1") công thêm 1 đơn vị. Khi mình bấm 2 lần thì O8 của Sheets("CD-L1") bằng 2 và các Sheet tiếp theo làn lượt là 3,4 ... do vậy dẫn đến tên O8 và tên Sheet khác nhau do Code chạy từ 2 lần trở lên
Nếu tên Ô và tên Sheet giống nhau " Sheets("CD-L1"); O8 =1 .: ............" công thêm 1 ) thì bạn thử cái này thử
HTML:
Sub DanhsoSheets1()
    Dim i As Long, ShName As String, Str As String
    On Error Resume Next
    Str = "CD-L"
    For Each Sh In Worksheets
        If Sh.Name Like Str & "*" Then
            With Sh
                .Select
                .Range("O8") = Replace(Sh.Name, Str, "", 1)
            End With
        End If
    Next Sh
End Sub

Với Sub này e sửa thành từ sheets thứ 2 trở đi bắt đầu cộng số. Nếu cho For chạy từ i đến max nghĩa có có thể 10 sheets hoặc nhiều hơn thì sửa như nào ạ. DanhsoSheets1 nhiều biến hay hàm em chưa hiểu lắm vì em đang tập tọe từng bước.
Sub DanhsoSheets()
Dim i As Long
Dim ShName As String
For i = 1 To 5
ShName = "CD-L" & i + 1
With Sheets(ShName)
.Select
.Range("O8") = Sheets("CD-L1").Range("O8") + i
End With
Next i
End Sub
 
Upvote 0
Với Sub này e sửa thành từ sheets thứ 2 trở đi bắt đầu cộng số. Nếu cho For chạy từ i đến max nghĩa có có thể 10 sheets hoặc nhiều hơn thì sửa như nào ạ. DanhsoSheets1 nhiều biến hay hàm em chưa hiểu lắm vì em đang tập tọe từng bước.
Đại loại nó như vầy:
Khai báo 1 cái Nmax as long
- Nmax = ...
For I = 2 to Nmax
...........
ShName = "CD-L" & i
...........
.Range("O8") = Sheets("CD-L1").Range("O8") +i-1
...........
Next I​
 
Upvote 0
Đại loại nó như vầy:
Khai báo 1 cái Nmax as long
- Nmax = ...
For I = 2 to Nmax
...........
ShName = "CD-L" & i
...........
.Range("O8") = Sheets("CD-L1").Range("O8") +i-1
...........
Next I​
Nmax gán phần tử con như nào anh nhỉ, em ko gán vào Nmax nó chạy end sub luôn!
 
Upvote 0
Nmax gán phần tử con như nào anh nhỉ, em ko gán vào Nmax nó chạy end sub luôn!
Nmax là số lớp đất lớn nhất của bạn.
Ví dụ Sheets(" PhanlopK95") là Sheet chứa dữ liệu phân lớp và Cột A ( Từ A3 đến A1000 chẳng hạn ) chứa số lớp thì
Nmax=Application.Max(Sheets("PhanlopK95").range("A3:A1000"))​
Hoặc
With Sheets("PhanlopK95")
Nmax=Application.Max(.range("A3:A")&.range("A65535").End(3).Row)​
End With​
 
Upvote 0
Nmax là số lớp đất lớn nhất của bạn.
Ví dụ Sheets(" PhanlopK95") là Sheet chứa dữ liệu phân lớp và Cột A ( Từ A3 đến A1000 chẳng hạn ) chứa số lớp thì
Nmax=Application.Max(Sheets("PhanlopK95").range("A3:A1000"))​
Hoặc
With Sheets("PhanlopK95")
Nmax=Application.Max(.range("A3:A")&.range("A65535").End(3).Row)​
End With​
Với vùng range trong bảng tính thì cấu trúc em hiểu rồi Nhưng đối với số sheets thì e nghĩ mãi chưa ra. a đưa ví dụ luôn với code trên DanhSoSheet () dùm em ạ
Em vừa chỉnh code chạy được rồi nhưng em nhìn nó chưa được như ý, em cảm thấy hơi cổ:
Sub DanhsoSheets3()
Dim i As Long, Nmax As Long
Dim ShName As String

On Error GoTo Thoat
For i = 2 To 1986
ShName = "CD-L" & i
With Sheets(ShName)
.Select
.Range("O8") = Sheets("CD-L1").Range("O8") + i - 1
End With
Next i
Thoat: MsgBox ("Thành Công")
End Sub
 
Upvote 0
Bình thường mình chỉ thấy là End (xlUp) hoặc End(xlDown) hoặc End(xlToRight) hoặc End.(xlToLeft) chứ em thấy trong 1 số CODE có đoạn này..............End(3))..................

Số 3 này có phải ý nghĩa là xlUp hay không?

Hay là từ ô đang lựa chọn sẽ được di chuyển lên 3 dòng và qua trái 3 dòng ?????

Vậy không biết có các số 1, 2, 4 nữa không và nghĩa là gì ạ?

Nhờ các thầy và các bạn giải thích hộ mình với, em xin cảm ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
Bình thường mình chỉ thấy là End (xlUp) hoặc End(xlDown) hoặc End(xlToRight) hoặc End.(xlToLeft) chứ em thấy trong 1 số CODE có đoạn này..............End(3))..................

Số 3 này có phải ý nghĩa là xlUp hay không?

Hay là từ ô đang lựa chọn sẽ được di chuyển lên 3 dòng và qua trái 3 dòng ?????

Vậy không biết có các số 1, 2, 4 nữa không và nghĩa là gì ạ?

Nhờ các thầy và các bạn giải thích hộ mình với, em xin cảm ơn!
Úi. Viết được cả 1 dự án lớn bây giờ Bác còn hỏi cái này :p
End(xlDown) = End(4)
End(xlup)
= End(3)
End(xlToRight) = End(2)
End(xlToLeft) = End(1)
 
Upvote 0
Bình thường mình chỉ thấy là End (xlUp) hoặc End(xlDown) hoặc End(xlToRight) hoặc End.(xlToLeft) chứ em thấy trong 1 số CODE có đoạn này..............End(3))..................

Số 3 này có phải ý nghĩa là xlUp hay không?

Hay là từ ô đang lựa chọn sẽ được di chuyển lên 3 dòng và qua trái 3 dòng ?????

Vậy không biết có các số 1, 2, 4 nữa không và nghĩa là gì ạ?

Nhờ các thầy và các bạn giải thích hộ mình với, em xin cảm ơn!
số 3 tương đương với xlUp mà bạn, người ta viết xlUp trông trực quan hơn, 1 rừng xà nu code thì đọc cũng dễ hiểu hơn!
 
Upvote 0
Úi. Viết được cả 1 dự án lớn bây giờ Bác còn hỏi cái này :p
End(xlDown) = End(4)
End(xlup)
= End(3)
End(xlToRight) = End(2)
End(xlToLeft) = End(1)
(Ôi đối với mình thực thực là lớn đấy) nhưng mà toàn công sức của diễn đàn và đặc biệt là sự nhiệt tình của Bác PacificPr cả thôi. Thực sự cảm ơn các bạn nhiều lắm, mình không phải dân IT nhưng mà cũng đang cố gắng hiểu để có thể hoàn thiện dự án nhỏ của mình sớm nhất.
 
Upvote 0
Sao đến phần định dạng kẻ khung mình làm lúc thì được, lúc thì lại báo lỗi "unable to set the linestyle property of the border class"

Mình làm CODE như thế này bị báo lỗi tại sheet 1, còn các sheet khác thì sử dụng bình thường, Các bạn chỉ mình với lý do với
Mã:
Sub Dinh_Dang()

    Dim ir As Integer
    Dim ic As Integer

    ir = 6                                                                      ' Dòng đầu tiên chứa dữ liệu cần định dạng
    ic = Range("C65536").End(xlUp).Row        ' Dòng cuối cùng chứa dữ liệu cần định dạng

    Range("A" & ir, "L" & ic).Select
    Selection.HorizontalAlignment = xlCenter     'canh giữa cho đều theo cột
   
    Selection.Borders(xlInsideVertical).LineStyle = xlContinuous        ' Kẻ dòng đứng
    Selection.Borders(xlInsideHorizontal).LineStyle = xlDot             ' Kẻ dòng ngang
    Selection.Borders(xlEdgeLeft).LineStyle = xlContinuous              ' Kẻ khung trái
    Selection.Borders(xlEdgeTop).LineStyle = xlContinuous               ' Kẻ khung trên
    Selection.Borders(xlEdgeBottom).LineStyle = xlContinuous            ' Kẻ khung dưới
    Selection.Borders(xlEdgeRight).LineStyle = xlContinuous             ' Kẻ khung phải



End Sub
 
Upvote 0
Thưa thầy!
Cho em hỏi : Vùng bôi mầu xanh của em đang tìm được là J8 giờ em muốn cộng 1 thành J9 (bôi đỏ) thì phải làm như nào, mong thầy giúp đỡ em. Em xin chân thành cảm ơn!
Nmax = Application.Max(Rng)
NameSh = ActiveSheet.Name: DK = False
If NameSh = "CDL-K95" Then CelLink = "O8"
If NameSh = "DTL-K95" Then CelLink = "J8"
For i = LBound(arr) To UBound(arr)
If arr(i) = NameSh Then
DK = True: Exit For
End If
Next i
If DK = True Then
Sheets(NameSh).Range(CelLink).Copy
Sheets(NameSh).Range(CelLink + 1).PasteSpecial Paste:=xlPasteFormats
For i = 1 To Nmax
 

File đính kèm

  • Untitled.png
    Untitled.png
    46.2 KB · Đọc: 5
Upvote 0
Bạn thử xài .Offset(1) hay .Offset(,1)
Có thể 1 trong 2 cách này sẽ đúng í bạn.
 
Upvote 0
Thưa thầy!
Cho em hỏi : Vùng bôi mầu xanh của em đang tìm được là J8 giờ em muốn cộng 1 thành J9 (bôi đỏ) thì phải làm như nào, mong thầy giúp đỡ em. Em xin chân thành cảm ơn!
Bạn sửa lại vầy xem sao.
Mã:
Sheets(NameSh).Range(CelLink).Offset(1).PasteSpecial Paste:=xlPasteFormats
 
Upvote 0
Mình viết trên máy chạy ok nhưng khi gởi cho người khác dùng thì bị báo như vầy, có 2 file giống nhau nhưng chỉ có 1 file bị, các câu như chr , mid là báo, bỏ đi thì chạy bình thường, trong khi 1 file khác cũng dùng lệnh đó thì không thấy báo gì. thanks !
 

File đính kèm

  • Lỗi.png
    Lỗi.png
    249.2 KB · Đọc: 6
Upvote 0
Mình viết trên máy chạy ok nhưng khi gởi cho người khác dùng thì bị báo như vầy, có 2 file giống nhau nhưng chỉ có 1 file bị, các câu như chr , mid là báo, bỏ đi thì chạy bình thường, trong khi 1 file khác cũng dùng lệnh đó thì không thấy báo gì. thanks !
Viết đích danh thành "Strings.Chr(10)" xem có khỏi không?
 
Upvote 0
Nhờ chỉnh hộ code với ah:
1. Code file tạo addin:
Public Sub Xuat()
Dim i As Long
For i = 2 To 16
With ActiveWorkbook
Sheet2.Cells(i, 1).Formula = "='Sheet1'!B" & i
Sheet3.Cells(i, 1).Formula = "='Sheet1'!a" & i
End With
Next
End Sub
=======> code này mình tạo thành addin.xla (chỉ giữ lại sheet1).
2. Sau đó mình imort vào excel: Từ file excel thứ 2 mình dùng code sau gọi sub thì báo lỗi (chắc sai địa chỉ kiểu active mà mình ko biết xử lý sao):
Sub Button1_Click()
Application.Run ("'addin.xla'!xuat")
End Sub

Nhờ hướng dẫn (sửa code với ah). Thanks mọi người.
 
Upvote 0
Nhờ chỉnh hộ code với ah:
1. Code file tạo addin:
Public Sub Xuat()
Dim i As Long
For i = 2 To 16
With ActiveWorkbook
Sheet2.Cells(i, 1).Formula = "='Sheet1'!B" & i
Sheet3.Cells(i, 1).Formula = "='Sheet1'!a" & i
End With
Next
End Sub
=======> code này mình tạo thành addin.xla (chỉ giữ lại sheet1).
2. Sau đó mình imort vào excel: Từ file excel thứ 2 mình dùng code sau gọi sub thì báo lỗi (chắc sai địa chỉ kiểu active mà mình ko biết xử lý sao):
Sub Button1_Click()
Application.Run ("'addin.xla'!xuat")
End Sub

Nhờ hướng dẫn (sửa code với ah). Thanks mọi người.
Bạn thử sửa thế này nhé!
Mã:
Public Sub Xuat()
Dim i As Long
For i = 2 To 16
With ActiveWorkbook
    .Sheets(1).Cells(i, 1).Formula = "='Sheet1'!B" & i
End With
Next
End Sub
và code để gọi nó như sau:
Mã:
Sub GPE()
Application.Run ("'addin.xla'!xuat")
End Sub
 
Upvote 0
Anh chị giúp em với.
Trong file của em có 2 code, 1 code để em click vào icon sẽ tự động insert dòng và copy công thức của dòng trên xuống, nhưng file em chia sẻ cho người khác nhập nên khóa công thức bằng protect của excel, nên em cho thêm 1 code để vba vẫn chạy được khi sheet bị bảo vệ, 2 code này em lấy trên web của mình, nhưng khi tắt file đi và mở lại thì em phải unprotect, run lại code rồi protect lại mới được cho người khác dùng được, việc này rất bất tiện, mọi người có thể chỉnh giúp em code 2 để nó tự chạy khi mở file mà em không cần phải làm mấy thao tác trên được không ạ, với em muốn chỉnh để cho code này chạy trên toàn bộ workbook mà không phải cài vào từng sheet thì có được không? :(:(:(:(:(:(:(

Private Sub Workbook_Open()
With Sheet2
.EnableOutlining = True
.Protect Password:="123", Contents:=True, UserInterfaceOnly:=True
End With
End Sub


Em cảm ơn mọi người nhiều lắm.
 

File đính kèm

Upvote 0
Thưa thầy! em làm 1 code copy như này bị sai ở đâu, và có phải khai báo thêm biến gì nữa không. Và cách viết khác như thủ tục em làm không ạ:
Sub MaBB_KL()
Sheets("KLL-K95").Select
Range("J9").Copy

Sheets("KL-L1").Select
Range("J8").PasteSpecial Paste:=xlPasteValues

Application.CutCopyMode = False
End Sub
 
Upvote 0
Thưa thầy! em làm 1 code copy như này bị sai ở đâu, và có phải khai báo thêm biến gì nữa không. Và cách viết khác như thủ tục em làm không ạ:
Sub MaBB_KL()
Sheets("KLL-K95").Select
Range("J9").Copy

Sheets("KL-L1").Select
Range("J8").PasteSpecial Paste:=xlPasteValues

Application.CutCopyMode = False
End Sub
http://www.giaiphapexcel.com/diendan/threads/vấn-đề-copy-trong-vba.29457/
Xem ở đây bạn
 
Upvote 0
Thưa thầy: Code của em dùng vòng For đang cho chạy từ 1~5 tách thành 5 sheet: giờ em muốn khi bấm vào code nó sẽ hỏi là muốn copy thành bao nhiêu sheets thì làm như nào ạ:
Sub Macro1()
Dim ShName As String
Dim i As Long
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Activate
For i = 1 To 5
ShName = ("KL.D") & i
ws.Copy After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
ActiveSheet.Name = ShName
Next i
End Sub
 
Upvote 0
Thưa thầy: Code của em dùng vòng For đang cho chạy từ 1~5 tách thành 5 sheet: giờ em muốn khi bấm vào code nó sẽ hỏi là muốn copy thành bao nhiêu sheets thì làm như nào ạ:
Sub Macro1()
Dim ShName As String
Dim i As Long
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Activate
For i = 1 To 5
ShName = ("KL.D") & i
ws.Copy After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
ActiveSheet.Name = ShName
Next i
End Sub
Em xen ngang 1 tí nha
1. Nếu muốn xuất từ số ... đến số ... bạn làm 1 Form như kiểu máy in ấy .... Xong gắn vào vòng lặp
2. Nếu Sheet có công thức thì Code trên sẽ có vấn đè không lấy được số "chêt"
 
Upvote 0
Em xen ngang 1 tí nha
1. Nếu muốn xuất từ số ... đến số ... bạn làm 1 Form như kiểu máy in ấy .... Xong gắn vào vòng lặp
2. Nếu Sheet có công thức thì Code trên sẽ có vấn đè không lấy được số "chêt"
Em chỉ muốn copy số lượng sheet thôi ạ! Code sẽ phải sửa như nào ạ
 
Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom