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
Mã:
sub down()
 Dim ChromeLocation  As String
Linkurl   ' là link down trực tiếp
 ChromeLocation = "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
  Shell (ChromeLocation & " -url & Linkurl )
End sub

Khi chạy code trên đến đoạn gọi Firefox thì cửa sổ trình duyệt bung ra, rất bất tiện, vì em không cần thao tác tay trên trình duyệt nên
Em muốn ẩn Firefox khi chạy code ( giống như IE mình có lệnh : IE.visble = false), Mong các anh giúp đỡ!
 
Upvote 0
Insert từng record là cách căn bản của chạy trực tiếp trên CSDL
Dùng recordset là dùng giao diện gián tiếp qua code.
Đã viết code thì dùng giao diện tiện hơn.
 
Upvote 0
Có ai giúp giùm em cái này không ạ. file excel của em khi chạy marco vba này luôn mặc định là trình duyệt IE. em muốn chuyển sang mở bằng Chrome hoặc Firefox nhưng em k biết về code. đoạn code trong file module như sau:



Option Explicit
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim URL As String
Dim BVISIBLE As Boolean
Dim DELAY As Long
Dim NUM As String
Dim SHUTD As Integer

Dim SES_col As Integer
Const TYPE_CLICK As String = "CLICK"
Const TYPE_SET As String = "SET"
Const TYPE_URL As String = "URL"
Const TYPE_GET As String = "GETDATA"
Const TYPE_GETLINK As String = "GETLINK"
Const TYPE_SEND As String = "SEND"
Const TYPE_SEARCH1 As String = "SEARCHLINK"
Const TYPE_FORCE As String = "FORCE" 'right type

Sub reg_web()
Dim sh As Variant
Dim i, j As Long
Dim r1, r2, r3 As Variant
Dim rowfrom, colfrom As Long

Set sh = ThisWorkbook.ActiveSheet

If Not init(sh) Then
Exit Sub
End If

colfrom = 0
NUM = 0
ReDim r1(NUM)
ReDim r2(NUM)
ReDim r3(NUM)
For j = 1 To 65535
If sh.Rows(2).Cells(j).value = "" And sh.Rows(2).Cells(j + 1).value = "" _
And sh.Rows(2).Cells(j + 2).value = "" Then
Exit For
End If

NUM = NUM + 1
ReDim Preserve r1(1 To NUM)
ReDim Preserve r2(1 To NUM)
ReDim Preserve r3(1 To NUM)
r1(j) = Trim(CStr(sh.Rows(2).Cells(j).value))
r2(j) = Trim(CStr(sh.Rows(3).Cells(j).value))
If colfrom = 0 And _
StrComp(Left(sh.Rows(2).Cells(j).value, Len(TYPE_SET)), _
TYPE_SET, vbTextCompare) = 0 Then 'col for available of data,
colfrom = j
End If

Next j

rowfrom = Application.Max(sh.Cells(1, SES_col), 4) '4 is start

For i = rowfrom To 65535
sh.Cells(1, SES_col) = i
If (sh.Cells(i, colfrom) = "" _
And sh.Cells(i + 1, colfrom) = "" _
And sh.Cells(i + 2, colfrom) = "") Then
Exit For
ThisWorkbook.Save
End If
If i Mod 10 = 0 Then
ThisWorkbook.Save
End If

If sh.Cells(i, colfrom) <> "" Then
For j = 1 To NUM
r3(j) = Trim(CStr(sh.Rows(i).Cells(j).value))
Next j
sh.Cells(i, NUM + 1).value = "K" & reg(URL, r1, r2, r3, NUM)
End If

'write output and all infor again to excel
For j = 1 To NUM
sh.Rows(i).Cells(j).value = Format(r3(j))
sh.Rows(i).Cells(j).Font.Color = RGB(0, 0, 0)
If Mid(sh.Cells(i, NUM + 1).value, j, 1) = 1 Then
Else
sh.Rows(i).Cells(j).Font.Color = RGB(255, 0, 0)
End If

Next j

Next i
ThisWorkbook.Save

If SHUTD > 0 Then
Shell ("cmd /c shutdown -s -f -t 1")
End If

End Sub

Private Function reg(ByVal lurl As String, ByRef setref As Variant, ByRef setxpath As Variant, ByRef setvalue As Variant, ByVal n As Integer) As String
Dim htmldoc, oIE1Doc As HTMLDocument
Dim MyBrowser, oIE1 As InternetExplorer
Dim MyHTML_Element, oIE1Element As IHTMLElement
Dim i As Long
Dim ret, a As String
Dim out As String
Dim b As String

Application.DisplayAlerts = False
wait_time (3)

b = ShellRun("taskkill /f /im iexplore.exe")
b = ShellRun("taskkill /f /im MicrosoftEdge.exe")
b = ShellRun("taskkill /f /im ielowutil.exe")

Set MyBrowser = New InternetExplorer
MyBrowser.Visible = BVISIBLE

ret = String(n, "0")
For i = 1 To n
If setref(i) <> "" Then a = "0" Else: a = "1"
If StrComp(Left(setref(i), Len(TYPE_URL)), TYPE_URL, vbTextCompare) = 0 Then
lurl = URL
If StrComp(Left(setvalue(i), 4), "html", vbTextCompare) = 0 _
And setvalue(i) <> lurl Then 'URL ,reload page
lurl = setref(i)

End If

MyBrowser.navigate lurl
Loading MyBrowser, 1
Set htmldoc = MyBrowser.document
a = "1"
End If

If StrComp(Left(setref(i), Len(TYPE_CLICK)), TYPE_CLICK, vbTextCompare) = 0 Then 'if a button -> click
If ClickXpath(htmldoc, setxpath(i)) Then
Loading MyBrowser, 3
a = "1"
End If
End If

If StrComp(Left(setref(i), Len(TYPE_SEND)), TYPE_SEND, vbTextCompare) = 0 Then 'if a send key
If SendKeyhtml(MyBrowser, BVISIBLE, htmldoc, setxpath(i)) Then
Loading MyBrowser, 3
a = "1"
End If
End If

If StrComp(Left(setref(i), Len(TYPE_SET)), TYPE_SET, vbTextCompare) = 0 _
And setvalue(i) <> "" And setxpath(i) <> "" Then 'Set Object
If InputValueXpath(htmldoc, setxpath(i), setvalue(i)) Then
Loading MyBrowser, 1
a = "1"
Else
End If
End If

'output
If StrComp(Left(setref(i), Len(TYPE_GET)), TYPE_GET, vbTextCompare) = 0 _
And setxpath(i) <> "" Then 'Get Object
out = ""
If GetValueXpath(htmldoc, setxpath(i), out) Then
Loading MyBrowser, 1
a = "1"
Else
End If
setvalue(i) = out
End If

If StrComp(Left(setref(i), Len(TYPE_GETLINK)), TYPE_GETLINK, vbTextCompare) = 0 _
And setxpath(i) <> "" Then 'Get Object
out = ""
If GetLinkXpath(htmldoc, setxpath(i), out) Then
Loading MyBrowser, 1
a = "1"
Else
End If
setvalue(i) = out
End If

If StrComp(Left(setref(i), Len(TYPE_SEARCH1)), TYPE_SEARCH1, vbTextCompare) = 0 _
And setxpath(i) <> "" Then 'Get Search Object
out = ""
If SearchLink(htmldoc, setxpath(i), out) Then
Loading MyBrowser, 0
a = "1"
Else
End If
setvalue(i) = out
End If

'Check to continous or not
ret = Left(ret, i - 1) & a & Mid(ret, i + 1)
If StrComp(Right(setref(i), Len(TYPE_FORCE)), TYPE_FORCE, vbTextCompare) = 0 _
Or a <> "0" Then
Else
Exit For
End If

Next i

reg = ret
Set htmldoc = Nothing
MyBrowser.Stop
MyBrowser.Quit
Set MyBrowser = Nothing

Delete_IE_Cache
reg = ret
End Function


Private Function init(ByVal sh As Variant) As Boolean
Dim key As String

init = True
URL = sh.Cells(1, Application.Match("URL:", sh.Range("A1:AA1"), False) + 1)
BVISIBLE = False
If StrComp(sh.Cells(1, Application.Match("Visible:", sh.Range("A1:AA1"), False) + 1), "1", vbTextCompare) = 0 Then
BVISIBLE = True
End If
DELAY = Int(sh.Cells(1, Application.Match("DELAY:", sh.Range("A1:AA1"), False) + 1))

SHUTD = Int(sh.Cells(1, Application.Match("SHUTDOWN:", sh.Range("A1:AA1"), False) + 1))

SES_col = Application.Match("SESSION:", sh.Range("A1:AA1"), False) + 1

'Genuine
key = sh.Cells(1, Application.Match("ACTIVE:", sh.Range("A1:AA1"), False) + 1)
key = Main_Key_Check(sh, key)
sh.Cells(1, Application.Match("ACTIVE:", sh.Range("A1:AA1"), False) + 1) = key

'About:
sh.Cells(1, 1) = "DonateNEO:"
sh.Cells(1, Application.Match("DonateNEO:", sh.Range("A1:AA1"), False) + 1) = "AcdsTrQtcUu1hXqpdW5bwvgZSSpeeT12r8"

End Function
'<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>'
Private Sub Delete_IE_Cache()
Dim a As String
'using get output to wait until cmd end

a = ShellRun("taskkill /f /im iexplore.exe")
a = ShellRun("taskkill /f /im MicrosoftEdge.exe")
a = ShellRun("taskkill /f /im ielowutil.exe")
a = ShellRun("RunDll32.exe InetCpl.Cpl, ClearMyTracksByProcess 255")
a = ShellRun("RunDll32.exe InetCpl.Cpl, ClearMyTracksByProcess 32")
a = ShellRun("RunDll32.exe InetCpl.cpl, ClearMyTracksByProcess 4351")

'MicrosoftEdge.exe
a = ShellRun("cmd /c del /s /f /q C:\Users\Administrator\AppData\Local\Microsoft\Windows\INetCache\*")
a = ShellRun("cmd /c del /s /f /q C:\Users\Administrator\AppData\Local\Microsoft\Windows\INetCookies\*")
a = ShellRun("cmd /c del /s /f /q C:\Users\Administrator\AppData\Local\Microsoft\Windows\WebCache\*")

'C:\Users\Administrator\AppData\Local\Microsoft\Windows\INetCookies

wait_time (1)
End Sub
Private Function ShellRun(sCmd As String) As String

'Run a shell command, returning the output as a string

Dim oShell As Object
Set oShell = CreateObject("WScript.Shell")

'run command
Dim oExec As Object
Dim oOutput As Object
Set oExec = oShell.Exec(sCmd)
Set oOutput = oExec.StdOut

'handle the results as they are written to and read from the StdOut object
Dim s As String
Dim sLine As String
While Not oOutput.AtEndOfStream
sLine = oOutput.ReadLine
If sLine <> "" Then s = s & sLine & vbCrLf
Wend

ShellRun = s

End Function
Public Sub Loading(ByVal MyBrowser As InternetExplorer, Optional waitt As Integer = 0)
Const READYSTATE_COMPLETE As Integer = 4
Do
DoEvents
Loop Until MyBrowser.readyState = READYSTATE_COMPLETE And MyBrowser.Busy = False 'And MyBrowser.statusText = "Done" 'And MyBrowser.document.readyState = "complete"
wait_time (waitt + DELAY)
End Sub

Private Sub wait_time(ByVal a As Integer)
Dim time1, time2

If a > 59 Then
a = 59
End If

time1 = Now
time2 = Now + TimeValue("0:00:" & Format(a, "00"))
Do Until time1 >= time2
DoEvents
time1 = Now()
Loop

End Sub
 
Upvote 0
Kính chào các thầy các anh chị, em có xem được cái code của thầy dhn46 và mở rộng nó,
code đầu tiên là cộng từng phần tử tương ứng của 2 hàng bất kỳ trong mảng (được 1 hàng kết quả), rồi đếm ngược từ phần tử 200 của mảng xem hàng kết quả nào >0 và dài nhất, cuối cùng là chỉ ra các hàng thỏa mãn.

Vấn đề của em bây giờ là khi em mở rộng từ tìm 2 hàng thành 3,4,5...10 hàng như vậy thì code chạy nặng quá, em treo máy cả ngày chưa thấy xong. nguyên nhân em nghĩ là vì là em dùng nhiều vòng lặp for lồng nhau. em xin hỏi các thầy, các anh chị là có cách nào khác khả thi không ạ, làm ơn chỉ dạy em ạ. em cảm ơn nhiều.
 

File đính kèm

  • Vidu.rar
    355 KB · Đọc: 10
Upvote 0
Kính chào các thầy các anh chị, em có xem được cái code của thầy dhn46 và mở rộng nó,
code đầu tiên là cộng từng phần tử tương ứng của 2 hàng bất kỳ trong mảng (được 1 hàng kết quả), rồi đếm ngược từ phần tử 200 của mảng xem hàng kết quả nào >0 và dài nhất, cuối cùng là chỉ ra các hàng thỏa mãn.

Vấn đề của em bây giờ là khi em mở rộng từ tìm 2 hàng thành 3,4,5...10 hàng như vậy thì code chạy nặng quá, em treo máy cả ngày chưa thấy xong. nguyên nhân em nghĩ là vì là em dùng nhiều vòng lặp for lồng nhau. em xin hỏi các thầy, các anh chị là có cách nào khác khả thi không ạ, làm ơn chỉ dạy em ạ. em cảm ơn nhiều.
Nói rõ mục đích cho nhanh, viết lại cho nhanh. NÓi dài km mà chả rõ là đang nói cái gì sứt.
 
Upvote 0
Nói rõ mục đích cho nhanh, viết lại cho nhanh. NÓi dài km mà chả rõ là đang nói cái gì sứt.
Dạ
1. Cộng giá trị phần tử tương ứng của 10 hàng bất kỳ trong mảng= hàng kết quả
2. Đếm ngược từ cột 200 trở lại, tìm hàng kết quả có phần tử lớn hơn 0 dài nhất
3. Chỉ ra các hàng thỏa mãn
 
Upvote 0
"Tại anh không hiểu hay bởi dò trời.
Trời đày hai đưa xa nhau, đành lòng ôm tuyết lạnh mùa đông"
Nó là cái gì, nó nằm ở đâu, dữ liệu đầu vào lấy ở đâu, xuát kết quả vào đâu?
Tui người trần mắt hột có biết gì đâu về file của bạn.
 
Upvote 0
"Tại anh không hiểu hay bởi dò trời.
Trời đày hai đưa xa nhau, đành lòng ôm tuyết lạnh mùa đông"
Nó là cái gì, nó nằm ở đâu, dữ liệu đầu vào lấy ở đâu, xuát kết quả vào đâu?
Tui người trần mắt hột có biết gì đâu về file của bạn.
Dữ liệu là mảng Arr = [E11:GV1080]
Trả kết quả ra mảng mới bắt đầu từ [GX11] ( [GX11].Resize(UBound(sArr, 1), 2) = sArr)
Bài toán này nếu tìm 2,3 hàng thì chạy được (Nút Team2,3) nhưng nếu tìm 10 hàng thì chưa chạy được nên em muốn hỏi có thuật toán nào khác hợp lý hơn không ạ.
 
Upvote 0
Dữ liệu là mảng Arr = [E11:GV1080]
Trả kết quả ra mảng mới bắt đầu từ [GX11] ( [GX11].Resize(UBound(sArr, 1), 2) = sArr)
Bài toán này nếu tìm 2,3 hàng thì chạy được (Nút Team2,3) nhưng nếu tìm 10 hàng thì chưa chạy được nên em muốn hỏi có thuật toán nào khác hợp lý hơn không ạ.
Chỉ đoán là bạn đang cố liệt kê một nhóm các hàng thỏa mãn một điều kiện nào đó. Thử dùng đệ quy xem có được không?
 
Upvote 0
Em có đoạn code sau:
PHP:
Private Sub Workbook_open()
Dim clls As Range
Dim Bophan As String
Dim Noidung As String
Dim d As Date
Bophan = Sheets("Sign").Range("AH2") & Sheets("Sign").Range("E8")
d = FormatDateTime(Date, vbLongDate)
Noidung = Sheets("Sign").Range("AH3") & d
For Each clls In Range("G8:H" & Range("B" & Rows.Count).End(xlUp).Row)
    clls = Val(clls)
    clls.NumberFormat = "d/m/yyyy"
Next clls
Range("A2").Value = Noidung
Range("A3").Value = Bophan
Rows("8:5000").Hidden = False
Rows(Range("B" & Rows.Count).End(xlUp).Row + 1 & ":5000").Hidden = True
End Sub

Cho em hỏi đoạn code d = FormatDateTime(Date, vbLongDate)
Em dùng để format theo giờ hệ thống nhưng các máy khác chưa chắc đặt giờ hệ thống giống máy em. Vậy sửa code thế nào để cho phần định dạng theo đúng giá trị là
tháng/năm.
Ngoài ra anh chị xem code trên có thể tối giản cho chạy nhanh hết mức có thể không thì chỉ cho em nhé.
Em cảm ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
Vô lý nhỉ, biến d là date, d = FormatDateTime(Date, vbLongDate) chẳng có một chút tác dụng nào, thà viết d=date cho nó nhanh. dùng hàm format xem
Mình sửa thành như vậy đã theo ý
Option Explicit
Private Sub Workbook_open()
Dim clls As Range
Dim Bophan As String
Dim Noidung As String
Dim d As Date
Bophan = Sheets("Sign").Range("AH2") & Sheets("Sign").Range("E8")
Noidung = Sheets("Sign").Range("AH3") & Format(Date, "mm-yyyy")
For Each clls In Range("G8:H" & Range("B" & Rows.Count).End(xlUp).Row)
clls = Val(clls)
clls.NumberFormat = "d/m/yyyy"
Next clls
Range("A2").Value = Noidung
Range("A3").Value = Bophan
Rows("8:5000").Hidden = False
Rows(Range("B" & Rows.Count).End(xlUp).Row + 1 & ":5000").Hidden = True
End Sub

Nhưng tốc độ còn chậm không biết có hướng xử lý mảng nào hiệu quả hơn là duyệt từng Cell không nhỉ mọi người?
 
Upvote 0
Mình sửa thành như vậy đã theo ý
Option Explicit
Private Sub Workbook_open()
Dim clls As Range
Dim Bophan As String
Dim Noidung As String
Dim d As Date
Bophan = Sheets("Sign").Range("AH2") & Sheets("Sign").Range("E8")
Noidung = Sheets("Sign").Range("AH3") & Format(Date, "mm-yyyy")
For Each clls In Range("G8:H" & Range("B" & Rows.Count).End(xlUp).Row)
clls = Val(clls)
clls.NumberFormat = "d/m/yyyy"
Next clls
Range("A2").Value = Noidung
Range("A3").Value = Bophan
Rows("8:5000").Hidden = False
Rows(Range("B" & Rows.Count).End(xlUp).Row + 1 & ":5000").Hidden = True
End Sub

Nhưng tốc độ còn chậm không biết có hướng xử lý mảng nào hiệu quả hơn là duyệt từng Cell không nhỉ mọi người?
tính xem cái vùng dữ liệu đó là gì, rồi rng.value=rng.value
rng.numberformat=.....
 
Upvote 0
Em có một đối tượng tên là Pic1 tại sheet 2. Làm thế nào để dùng vba copy nó sang sheet 1?
 
Upvote 0
Nhờ mọi người giúp code này:

Function TT(cell As Range)
TT = Evaluate("=" & cell)
End Function

Công dụng: trong cell A1 có nội dung 2*2 thì hàm trong cell B1 là TT(A1) sẽ có giá trị 4.
Tuy nhiên nếu cell A1 có giá trị là 2.1 thì hàm trong cell B1 là TT(A1) sẽ có giá trị #VALUE! mà không phải là 2.1

Vì vậy em nhờ mọi người giúp code này để hiện ra giá trị 2.1
 
Upvote 0
Nhờ mọi người giúp code này:

Function TT(cell As Range)
TT = Evaluate("=" & cell)
End Function

Công dụng: trong cell A1 có nội dung 2*2 thì hàm trong cell B1 là TT(A1) sẽ có giá trị 4.
Tuy nhiên nếu cell A1 có giá trị là 2.1 thì hàm trong cell B1 là TT(A1) sẽ có giá trị #VALUE! mà không phải là 2.1

Vì vậy em nhờ mọi người giúp code này để hiện ra giá trị 2.1
Bạn thử như thế này xem có được không
Mã:
Function TT(Str As String)
    Str = Replace(Str, ",", ".")
    TT = Evaluate("=" & Str)
End Function
 
Upvote 0
Bạn thử như thế này xem có được không
Mã:
Function TT(Str As String)
    Str = Replace(Str, ",", ".")
    TT = Evaluate("=" & Str)
End Function
Tôi nghĩ vầy mới đúng:
Mã:
Function TT(ByVal Text As String)
  Dim tmp
  TT = Text
  tmp = Evaluate(Text)
  If TypeName(tmp) <> "Error" Then TT = tmp
End Function
Tức nếu không tính toán được thì để nguyên. Tự ý thay đổi dấu chấm dấu phẩy là điều không nên, bởi ai mà biết được máy tính nào quy định thế nào về dấu thập phân và phân cách ngàn
 
Upvote 0
Tự ý thay đổi dấu chấm dấu phẩy là điều không nên, bởi ai mà biết được máy tính nào quy định thế nào về dấu thập phân và phân cách ngàn
Em tưởng trong VBA thì vẫn luôn là chấm chứ anh.
(Không tính trường hợp chuỗi một số gồm cả chấm và phẩy).
 
Upvote 0
Em tưởng trong VBA thì vẫn luôn là chấm chứ anh.
(Không tính trường hợp chuỗi một số gồm cả chấm và phẩy).
Nhưng người ta nói vầy:
Tuy nhiên nếu cell A1 có giá trị là 2.1 thì hàm trong cell B1 là TT(A1) sẽ có giá trị #VALUE! mà không phải là 2.1

Vì vậy em nhờ mọi người giúp code này để hiện ra giá trị 2.1
Vậy chuyện này là sao?
 
Upvote 0
Em tưởng trong VBA thì vẫn luôn là chấm chứ anh.
VBa, hay chính xác hơn là ngôn ngữ VB thì nó tính theo dấu chấm. Còn cái Evaluate nó không phải là vba, nó là thứ người ta viết ra dựa trên vb. Tóm lại là nó tính theo thiết lập của Excel. Tóm lại là anh kiểm tra lại hộ em cái.
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom