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
Chào cả nhà ạ, em có code như sau nhưng nó dài quá muốn nhờ các bạn rút gọn lại ạ.
Đây là code lấy vùng dữ liệu của 3 file excel nhập vào chung 1 sheet ở file excel khác em copy được ở trên mạng về chế biến thêm ạ ^^!

Mã:
Option Explicit
Sub noibang1()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\ky1.xlsx"
  sSheet = "G000141"
  sAddr = "C19:I785"
  Range("A1:G767") = GetData(sFile, sSheet, sAddr)
End Sub

Sub noibang2()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\ky2.xlsx"
  sSheet = "G000141"
  sAddr = "C19:I785"
  Range("I1:O767") = GetData(sFile, sSheet, sAddr)
End Sub

Sub noibang3()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\ky3.xlsx"
  sSheet = "G000141"
  sAddr = "C19:I785"
  Range("Q1:W767") = GetData(sFile, sSheet, sAddr)
End Sub

Function GetData(sFile As String, sSheet As String, sAddr As String)
  Dim pLink As String, iR As Long, iC As Long, Arr
  If Len(Dir(sFile)) Then
    Arr = Range(sAddr)
    pLink = "'" & Replace(sFile, Dir(sFile), "[" & Dir(sFile) & "]") & sSheet & "'!"
    For iR = 1 To Range(sAddr).Rows.Count
      For iC = 1 To Range(sAddr).Columns.Count
        Arr(iR, iC) = ExecuteExcel4Macro(pLink & Range(sAddr).Cells(iR, iC).Address(, , 2))
      Next iC
    Next iR
    GetData = Arr
  End If
End Function

Mã:
Option Explicit

Sub noibang123(byVal soBang As Integer)
  Dim sFile As String, sAddr As String
  Select Case soBang
  Case 1
    sFile = ThisWorkbook.Path & "\ky1.xlsx"
    sAddr = "A1"
  Case 2
    sFile = ThisWorkbook.Path & "\ky2.xlsx"
    sAddr = "I1"
  Case 3
    sFile = ThisWorkbook.Path & "\ky3.xlsx"
    sAddr = "Q1"
  Case Else
    Exit Sub
  End Select
  Range(sAddr).Resize(767,7) = GetData(sFile,"G000141","C19:I785")
End Sub

Sub noibang1()
noibang123 1
End Sub

Sub noibang2()
noibang123 2
End Sub

Sub noibang3()
noibang123 3
End Sub

Function GetData(sFile As String, sSheet As String, sAddr As String)
' Khong cần sửa, vả lại ai biết bạn muốn làm gì mà sửa
End Function
 
Upvote 0
Mã:
Option Explicit

Sub noibang123(byVal soBang As Integer)
  Dim sFile As String, sAddr As String
  Select Case soBang
  Case 1
    sFile = ThisWorkbook.Path & "\ky1.xlsx"
    sAddr = "A1"
  Case 2
    sFile = ThisWorkbook.Path & "\ky2.xlsx"
    sAddr = "I1"
  Case 3
    sFile = ThisWorkbook.Path & "\ky3.xlsx"
    sAddr = "Q1"
  Case Else
    Exit Sub
  End Select
  Range(sAddr).Resize(767,7) = GetData(sFile,"G000141","C19:I785")
End Sub

Sub noibang1()
noibang123 1
End Sub

Sub noibang2()
noibang123 2
End Sub

Sub noibang3()
noibang123 3
End Sub

Function GetData(sFile As String, sSheet As String, sAddr As String)
' Khong cần sửa, vả lại ai biết bạn muốn làm gì mà sửa
End Function
À mình muốn copy dữ liệu tự động từ 3 file ky1,2,3 (vùng dữ liệu giống nhau là C19:I785, tên sheet giống nhau là G000141) vào chung 1 sheet ở file thứ 4.

Bạn cho hỏi thêm là muốn copy vào sheet chỉ định ở file thứ 4 được không ạ (ví dụ sheeet Tonghop), trước khi copy thì xóa hết dữ liệu ở sheet Tonghop ạ.

Cảm ơn./.
 
Upvote 0
Bạn cho hỏi thêm là muốn copy vào sheet chỉ định ở file thứ 4 được không ạ (ví dụ sheeet Tonghop), trước khi copy thì xóa hết dữ liệu ở sheet Tonghop ạ.

Ai mà biết các sub noibang1,2,3 được gọi bằng cách nào?
Lúc sửa code, tôi cố tình sửa theo cách để không ảnh hưởng đến những cái bạn không đưa ra. Tức là những cái gì đó gọi sub noibang1,2,3 chúng không hề biết là các sub này đã thay đổi.
Muốn làm hơn nữa thì phải biết cái file của bạn nó ra ao.
 
Upvote 0
Ai mà biết các sub noibang1,2,3 được gọi bằng cách nào?
Lúc sửa code, tôi cố tình sửa theo cách để không ảnh hưởng đến những cái bạn không đưa ra. Tức là những cái gì đó gọi sub noibang1,2,3 chúng không hề biết là các sub này đã thay đổi.
Muốn làm hơn nữa thì phải biết cái file của bạn nó ra ao.
À vâng, mình gửi kèm file bạn xem giùm với ạ
 

File đính kèm

  • ABC.rar
    140.4 KB · Đọc: 0
Upvote 0
Trong file mình có 2 Function, ý tưởng viết đều như nhau nhưng Function GPE2 lại báo lỗi Ref, mong các bạn trợ giúp
Mã:
Function GPE2(Rng As Range, SP As String, Num As Long)
    Dim frng As Range
    Set frng = Rng.Resize(, 1).Find(SP, , xlValues, xlWhole, , , True)(, 2)
    GPE2 = IIf(frng > Num Or frng(, 2) < Num, Space(0), frng + Num - 1)
    Set frng = Nothing
End Function
 

File đính kèm

  • BC (2).xlsm
    21.2 KB · Đọc: 8
Upvote 0
Trong file mình có 2 Function, ý tưởng viết đều như nhau nhưng Function GPE2 lại báo lỗi Ref, mong các bạn trợ giúp
Mã:
Function GPE2(Rng As Range, SP As String, Num As Long)
    Dim frng As Range
    Set frng = Rng.Resize(, 1).Find(SP, , xlValues, xlWhole, , , True)(, 2)
    GPE2 = IIf(frng > Num Or frng(, 2) < Num, Space(0), frng + Num - 1)
    Set frng = Nothing
End Function
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.
 
Upvote 0
Upvote 0
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

  • Book1.xlsm
    15.6 KB · Đọc: 2
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
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom