EXCEL TOOLS
Excel Add-ins ที่พัฒนาโดยคุณสันติพงศ์ ณสุย (MVP Excel 2010-2020) ด้วยภาษา C# เพื่อแก้ไขปัญหาไฟล์ใหญ่ คำนวณนาน ทำงานช้า จัดการข้อมูลต่าง ๆ ที่ทำงานประจำวันได้อย่างสะดวกรวดเร็ว สนใจคลิกไปดูได้ที่นี่ครับ => Excel Tools
Excel Add-ins ที่พัฒนาโดยคุณสันติพงศ์ ณสุย (MVP Excel 2010-2020) ด้วยภาษา C# เพื่อแก้ไขปัญหาไฟล์ใหญ่ คำนวณนาน ทำงานช้า จัดการข้อมูลต่าง ๆ ที่ทำงานประจำวันได้อย่างสะดวกรวดเร็ว สนใจคลิกไปดูได้ที่นี่ครับ => Excel Tools
[code]
และปิดด้วย [/code]
ตัวอย่างเช่น [code]dim r as range[/code]
เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)Code: Select all
Sub SearchContact()
Dim s As String
s = LCase(Range("b1").Value)
Workbooks.Open Range("B3").Value & ".xlsx"
Dim r As Range, v As String
With Sheets("production plan ")
.Range("a3").CurrentRegion.EntireRow.Hidden = False
For Each r In .Range("a8", .Range("a" & .Rows.Count).End(xlUp))
v = ""
v = v & r.Value
v = v & r.Offset(0, 1).Value
v = v & r.Offset(0, 2).Value
v = v & r.Offset(0, 3).Value
v = v & r.Offset(0, 4).Value
v = v & r.Offset(0, 5).Value
v = v & r.Offset(0, 6).Value
v = v & r.Offset(0, 7).Value
v = v & r.Offset(0, 8).Value
v = v & r.Offset(0, 5).Value
v = v & r.Offset(0, 6).Value
v = v & r.Offset(0, 7).Value
v = v & r.Offset(0, 8).Value
v = v & r.Offset(0, 9).Value
v = v & r.Offset(0, 10).Value
v = v & r.Offset(0, 11).Value
v = v & r.Offset(0, 12).Value
v = v & r.Offset(0, 13).Value
v = v & r.Offset(0, 14).Value
v = v & r.Offset(0, 15).Value
v = v & r.Offset(0, 16).Value
v = v & r.Offset(0, 17).Value
v = v & r.Offset(0, 18).Value
v = v & r.Offset(0, 19).Value
v = v & r.Offset(0, 20).Value
v = v & r.Offset(0, 21).Value
v = v & r.Offset(0, 22).Value
v = v & r.Offset(0, 23).Value
v = v & r.Offset(0, 24).Value
v = v & r.Offset(0, 25).Value
v = v & r.Offset(0, 26).Value
v = v & r.Offset(0, 27).Value
v = v & r.Offset(0, 28).Value
v = v & r.Offset(0, 29).Value
v = v & r.Offset(0, 30).Value
v = v & r.Offset(0, 31).Value
v = v & r.Offset(0, 32).Value
v = v & r.Offset(0, 33).Value
v = v & r.Offset(0, 34).Value
v = v & r.Offset(0, 35).Value
v = v & r.Offset(0, 36).Value
v = v & r.Offset(0, 37).Value
v = v & r.Offset(0, 38).Value
v = v & r.Offset(0, 39).Value
v = v & r.Offset(0, 40).Value
v = v & r.Offset(0, 41).Value
v = v & r.Offset(0, 42).Value
v = v & r.Offset(0, 43).Value
v = v & r.Offset(0, 44).Value
v = v & r.Offset(0, 45).Value
v = v & r.Offset(0, 46).Value
v = v & r.Offset(0, 47).Value
v = v & r.Offset(0, 48).Value
v = v & r.Offset(0, 49).Value
v = v & r.Offset(0, 50).Value
v = LCase(v)
If Not v Like "*" & s & "*" Then
r.EntireRow.Hidden = True
End If
Next r
Dim source As Range
Set source = Range("A8", .Range("A" & .Rows.Count).End(xlUp))
source.Copy
End With
Workbooks("ContactNo.xlsm").Activate
Range("A10").PasteSpecial xlPasteValues
Application.CutCopyMode = fasle
End Sub
Code: Select all
Sub SearchContact()
Dim s As String
Dim r As Range, v As String
Dim wb As Workbook
Dim source As Range
Dim a(999999, 50) As Variant
Dim i As Long
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With Worksheets("Sheet1")
s = LCase(.Range("b1").Value)
Set wb = Workbooks.Open(Filename:=.Range("B3").Value & ".xlsx", ReadOnly:=True)
End With
j = 0
With wb.Sheets("production plan ")
.Range("a3").CurrentRegion.EntireRow.Hidden = False
For Each r In .Range("a8", .Range("a" & .Rows.Count).End(xlUp))
v = VBA.Join(Application.Transpose( _
Application.Transpose(Application.Index(r.Resize(1, 51), 0))))
v = LCase(v)
If v Like "*" & s & "*" Then
For i = 0 To 50
a(j, i) = r.Offset(0, i).Value
Next i
j = j + 1
End If
Next r
End With
wb.Close False
ThisWorkbook.Worksheets("Sheet1").Range("A10").Resize(j, 51) = a
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
MsgBox "Finished.", vbInformation
End Sub
Code: Select all
ThisWorkbook.Worksheets("Sheet1").Range("A10").Resize(j, 1) = a
Code: Select all
v = VBA.Join(Application.Transpose( _
Application.Transpose(Application.Index(r.Resize(1, 51), 0))))
Code: Select all
ThisWorkbook.Worksheets("Sheet1").Range("A5").Resize(j, 51) = a
Code: Select all
Sub SearchContact()
Dim s As String
Dim r As Range, v As String
Dim wb As Workbook
Dim source As Range
Dim a(999999, 50) As Variant
Dim i As Long
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With Worksheets("Sheet1")
s = LCase(.Range("b2").Value)
Set wb = Workbooks.Open(Filename:=.Range("B1").Value & ".xlsx", ReadOnly:=True)
End With
j = 0
With wb.Sheets("production plan ")
.Range("a3").CurrentRegion.EntireRow.Hidden = False
For Each r In .Range("a8", .Range("a" & .Rows.Count).End(xlUp))
v = VBA.Join(Application.Transpose( _
Application.Transpose(Application.Index(r.Resize(1, 51), 0))))
v = LCase(v)
If v Like "*" & s & "*" Then
For i = 0 To 50
a(j, i) = r.Offset(0, i).Value
Next i
j = j + 1
End If
Next r
End With
wb.Close False
If a Is Nothing Then //ใส่ if เพิ่ม
MsgBox "ไม่มีข้อมุล" & ID, vbCritical
End Sub
Else
ThisWorkbook.Worksheets("Sheet1").Range("A5").Resize(j, 51) = a
End If
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
MsgBox "Finished.", vbInformation
End Sub
lnongkungl wrote: Wed Feb 24, 2021 11:15 am 3. รบกวนอาจารย์ อธิบาย code ตรงนี้ให้ทีครับ เป็น function ที่ผมไม่เคยใช้ เลยยังไม่ค่อยเข้าใจครับ จะได้นำไปประยุกต์ใช้ในโอกาสต่อไปครับขอบคุณครับCode: Select all
v = VBA.Join(Application.Transpose( _ Application.Transpose(Application.Index(r.Resize(1, 51), 0))))
r.Resize(1, 51)
แปลว่าให้ขยายตัวแปร r ไปทางขวา 51 คอลัมน์Application.Index(r.Resize(1, 51), 0)
ทำให้ช่วงข้อมูลเป็น Array โดยนำ Index ซึ่งเป็น Worksheet Function เข้ามาช่วย Application.Transpose(...)
เป็น Worksheet Function ที่นำมาช่วยสลับแกนของ Array แต่เนื่องจากใช้ช่วงเซลล์ใน Worksheet ซึ่งเป็น Array 2 มิติเป็นแหล่งข้อมูล จึงต้องทำการสลับแกน 2 รอบ (ใช้ Statement นี้ 2 ครั้ง) เพื่อให้เป็น Array 1 มิติที่สามารถนำมาเชื่อมกันด้วยฟังก์ชั่น Join ได้VBA.Join(...)
นำ Array มาเชื่อมกันlnongkungl wrote: Wed Feb 24, 2021 2:13 pm เจอปัญหาใหม่ครับ เมื่อทดลองใส่ ข้อมูลที่ผิด หรือไม่มี contract no นั้น เข้าไป พบว่า code error
Code: Select all
'...
If j = 0 Then
MsgBox "ไม่มีข้อมุล", vbCritical
Exit Sub
Else
'...
Code: Select all
Function SearchContact_Func(f As Range, c As Range) As Variant
Dim s As String
Dim r As Range, v As String
Dim wb As Workbook
Dim source As Range
Dim a(999999, 0) As Variant
Dim i As Long
Dim xlApp As Application
Application.Volatile
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With Worksheets("Sheet1")
s = LCase(c.Value)
Set wb = xlApp.Workbooks.Open(Filename:=f.Value & ".xlsx", ReadOnly:=True)
End With
j = 0
With wb.Sheets(1)
.Range("a3").CurrentRegion.EntireRow.Hidden = False
For Each r In .Range("a8", .Range("a" & .Rows.Count).End(xlUp))
v = VBA.Join(Application.Transpose( _
Application.Transpose(Application.Index(r.Resize(1, 51), 0))))
v = LCase(v)
If v Like "*" & s & "*" Then
a(j, 0) = r.Value
j = j + 1
End If
Next r
End With
wb.Close False
SearchContact_Func = a
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Function
Code: Select all
Set wb = Workbooks.Open(Filename:=.Range("B1").Value & ".xlsx", ReadOnly:=True)
lnongkungl wrote: Fri Feb 26, 2021 2:21 pm ในส่วนนี้ถ้าเราไม่กำหนดนามสกุล .xlsx คือให้พิมพ์ชื่อไฟล์และนามสกุลติดกันใน B1 เลย มีวิธีปรับ code ยังไงครับ
Code: Select all
Set wb = Workbooks.Open(Filename:="D:\folder\abcdefghijklmnopqrstuvwxyz.xlsx", ReadOnly:=True)
Code: Select all
Set wb = Workbooks.Open(Filename:=.Range("B1").Value, ReadOnly:=True)
& ".xlsx"
ใน Code ออกได้ครับCode: Select all
& ".xlsx"
Code: Select all
If........then
MsgBox "ไม่มีข้อมุล" & ID, vbCritical
else
Set wb = Workbooks.Open(Filename:=.Range("B1").Value, ReadOnly:=True)
End If
Code: Select all
Sub openbook()
Dim wb As Workbook
On Error GoTo err1
Set wb = Workbooks.Open(Filename:=.Range("B1").Value, ReadOnly:=True)
err1:
MsgBox "ไม่พบไฟล์ที่ค้นหา", vbCritical
Exit Sub
End Sub
Code: Select all
If Dir(fp & ".xlsx") = "" Then
MsgBox "File not found": Exit Sub
Code: Select all
Sub Search()
Application.ScreenUpdating = False
Dim s As String, fp As String, r As Range, a, n As Long, wb As Workbook, l As Long
fp = Range("B1").Value
s = LCase(Range("b2").Value)
If Dir(fp & ".xlsx") = "" Then
MsgBox "File not found": Exit Sub
Else
Set wb = Workbooks.Open(fp & ".xlsx", ReadOnly:=True)
l = wb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
ReDim a(l)
For Each r In wb.Sheets(1).Range("a8:a" & l)
a(n) = Join(Application.Transpose(Application.Transpose(r.Resize(, 51))), "^")
n = n + 1
Next
wb.Close
a = Filter(a, s)
If UBound(a) = -1 Then
MsgBox "No data": Exit Sub
Else
With [A5].Resize(UBound(a) + 1)
.Value = Application.Transpose(a)
.TextToColumns Destination:=Range("A5"), DataType:=xlDelimited, Other:=True, _
OtherChar:="^", FieldInfo:=Evaluate("choose({1,2},row(1:51),1)")
End With
End If
End If
Application.ScreenUpdating = True
End Sub
Bo_ry wrote: Fri Feb 26, 2021 5:54 pm Function ไม่ค่อยเหมาะกับการคืนหลายๆ ค่านอกจากจะใชักับ MS365 ที่มี Spill Array
ใช้ Sub ดีแล้ว