Chuyên mục xử lý, gỡ rối code VBA

Liên hệ QC
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,930
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
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom