同樣是抓取表單資料,可利用SeleniumBasic模擬操作瀏覽器抓取網頁資料
googel 試算表可以發布到網路,也就是將試算表轉變成網頁形式
如果直接抓取頁面資料貼回到Excel裡會有一些空白列
在 「Excel / 使用SeleniumBasic查詢發佈到網路的google sheets」的最後有提到需要再處理
趁這次辦理研習需要隨時彙整表單填寫情況
來整理之前的VBA程式
前置作業,必須將表單試算表到網路
但是表單填寫不是按照名單順序的
為了方便彙整,並且知道名單上還有誰沒有填寫表單
在表單工作簿新增了一個工作表,除了名單之外
透過VlookUp函數,查無對應的資料返回#N/A,就可以知道填寫情況
之後要發布到網路的也是這個工作表
操作介面
googel sheet 發布到網路的工作表
VBA程式
程式碼修改的部分都是處理格式居多,依照當前的工作表欄位做設定
透過函數統計#N/A的數量-還沒填寫、X-取消報名
在每個工作表的J欄新增顯示填寫狀況的資料
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
Sub WebTable42() Dim BOT As Object Set BOT = New WebDriver Application.ScreenUpdating = False Dim r As Integer r = Sheets(1).Range("A1").End(xlDown).Row '將前次查詢紀錄移到E、F欄 Sheets(1).Range("C2:D" & r).Copy Sheets(1).Range("E2").PasteSpecial Paste:=xlPasteAll Application.CutCopyMode = False '清除前次查詢紀錄 Sheets(1).Range("C2:D" & r).ClearContents Dim i As Integer Dim j As Integer Dim rr As Integer Dim q As Integer Dim TableName As String Dim TableUrl As String For i = 2 To r TableName = Sheets(1).Range("A" & i).Value TableUrl = Sheets(1).Range("B" & i).Value '如果有重複名稱工作表則刪除 For j = 2 To Sheets.Count If Sheets(j).Name = TableName Then '關閉警告提示 Application.DisplayAlerts = False Sheets(j).Delete Application.DisplayAlerts = True Exit For End If Next Sheets.Add after:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = TableName Application.CutCopyMode = False ' clears the clipboard BOT.AddArgument "--headless" '只能用在Chrome BOT.Start "chrome" 'Chrome-> BOT.Start "chrome" BOT.Wait (1000) BOT.Get TableUrl BOT.Wait (1000) ' BOT.FindElementByXPath("//*[@id='2014788522']/div/table").AsTable.ToExcel Sheets(2).Range("A1") BOT.FindElementByCss(".waffle").AsTable.ToExcel Sheets(TableName).Range("A1") ' 調整內容 ' 刪除空白列 With Sheets(TableName).Rows("1:1") .Delete Shift:=xlUp End With rr = Sheets(TableName).Range("A1").End(xlDown).Row '有資料才處理 If rr <> 1045678 Then ' 修改A欄的內容 With Sheets(TableName).Range("A1") .ClearContents .FormulaR1C1 = "序號" End With For q = 2 To rr With Sheets(TableName).Range("A" & q) .FormulaR1C1 = "=ROW()-1" .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With '調整E欄內容置中 With Sheets(TableName).Range("E" & q) .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With '調整F欄內容置中 With Sheets(TableName).Range("F" & q) .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With '調整H欄內容置中 With Sheets(TableName).Range("H" & q) .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With '調整I欄內容置中 With Sheets(TableName).Range("I" & q) .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With '調整J欄內容置中 With Sheets(TableName).Range("J" & q) .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With Next '設定k欄資料 Dim jAll As Integer jAll = Sheets(TableName).Range("J1").End(xlDown).Row - 1 Dim rng1 As Range Dim j1 As Integer Dim jX As Integer Set rng1 = Range("J2:J" & jAll + 1) j1 = Application.WorksheetFunction.CountIf(rng1, "#N/A") jX = Application.WorksheetFunction.CountIf(rng1, "X") Sheets(TableName).Range("K1").Value = "填寫人數" Dim kk As String kk = "填寫:" & jAll - j1 - jX & ",取消:" & jX & ",總數:" & jAll Sheets(TableName).Range("K2").Value = kk Dim cc As Integer cc = Sheets(TableName).Range("A1").End(xlToRight).Column '標題欄內容置中 With Sheets(TableName).Range(Cells(1, 1), Cells(1, cc)) .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With '調整欄寬 列高 With Sheets(TableName).Range(Cells(1, 1), Cells(rr, cc)) .Columns.AutoFit .Rows.AutoFit End With '將填寫人數寫入第一個工作表 Sheets("連線").Range("C" & i).Value = Sheets(TableName).Range("K2") '將查詢時間寫入第一個工作表 Sheets("連線").Range("D" & i).Value = Format(Now(), "yyyy/mm/dd--Hh:Nn:Ss") End If Next BOT.Quit Set BOT = Nothing Sheets("連線").Activate Range("C2").Activate Application.ScreenUpdating = True End Sub |
個別工作表調整格式後的樣式