2021年4月6日 星期二

[程式碼] 使用Excel + VBA實現通訊錄 (Tasker案例)

'ThisWorkbook
Private Sub Workbook_Open()
  shtApp.Activate
  UserForm1.Show
End Sub

'ShtApp
Private Sub Worksheet_activate()
  UserForm1.Show
End Sub


Private Sub Worksheet_Deactivate()
  UserForm1.Hide
End Sub


' UserForm
Dim gnDataRow As Long

Private Sub Userform_Initialize()
    gnDataRow = -1
End Sub

Private Sub SearchData(ByVal nSearchCol As Integer, ByVal strCondition As String)
    Dim row As Long
    
    listData.Clear
    
    For row = 2 To shtData.UsedRange.Rows.Count
    If InStr(shtData.Cells(row, nSearchCol).Value, strCondition) > 0 Then
      listData.AddItem Str(row) & vbTab & shtData.Cells(row, 1).Value & vbTab & shtData.Cells(row, 2).Value & vbTab & shtData.Cells(row, 3).Value & vbTab & shtData.Cells(row, 4).Value
    End If
  Next row
End Sub

Private Sub btnName_Click()
    SearchData 1, txtName.Text
End Sub

Private Sub btnMobile_Click()
    SearchData 2, txtMobile.Text
End Sub

Private Sub btnPhone_Click()
    SearchData 3, txtPhone.Text
End Sub

Private Sub btnAddr_Click()
    SearchData 4, txtAddr.Text
End Sub

Private Sub btnAdd_Click()
    Dim name As String, mobile As String, phone As String, addr As String
    Dim row As Long
    
    name = txtName.Text
    If "" = name Then
        MsgBox "請先輸入姓名", vbOKOnly, "資料新增"
        Exit Sub  ' 離開副程式
    End If
    
    mobile = txtMobile.Text
    phone = txtPhone.Text
    addr = txtAddr.Text
    
    For row = 2 To shtData.UsedRange.Rows.Count  ' 檢查是否有名字重複
      If shtData.Cells(row, 1).Value = name Then
        Exit For
      End If
    Next row
  
    If row <= shtData.UsedRange.Rows.Count Then
        If vbNo = MsgBox("名稱重複,是否確定加入?", vbYesNo, "名稱重複") Then
            Exit Sub  ' 離開副程式
        Else
            row = shtData.UsedRange.Rows.Count
        End If
    End If
    
    shtData.Cells(row, 1).Value = name
    shtData.Cells(row, 1).HorizontalAlignment = xlCenter
    
    shtData.Cells(row, 2).Value = mobile
    shtData.Cells(row, 2).HorizontalAlignment = xlCenter
    
    shtData.Cells(row, 3).Value = phone
    shtData.Cells(row, 3).HorizontalAlignment = xlCenter
    
    shtData.Cells(row, 4).Value = addr
    SearchData 1, ""
    gnDataRow = -1
End Sub

Private Sub btnModify_Click()
    If -1 = gnDataRow Then
        MsgBox "請先從列表中選擇資料", vbOKOnly, "資料修改"
        Exit Sub
    End If
    
    shtData.Cells(gnDataRow, 1).Value = txtName.Text
    shtData.Cells(gnDataRow, 1).HorizontalAlignment = xlCenter
    
    shtData.Cells(gnDataRow, 2).Value = txtMobile.Text
    shtData.Cells(gnDataRow, 2).HorizontalAlignment = xlCenter
    
    shtData.Cells(gnDataRow, 3).Value = txtPhone.Text
    shtData.Cells(gnDataRow, 3).HorizontalAlignment = xlCenter
    
    shtData.Cells(gnDataRow, 4).Value = txtAddr.Text
    
    SearchData 1, txtName.Text
    gnDataRow = -1
End Sub

Private Sub btnDelete_Click()
    If -1 = gnDataRow Then
        MsgBox "請先從列表中選擇資料", vbOKOnly, "資料刪除"
        Exit Sub
    End If
    
    shtData.Rows(gnDataRow).EntireRow.Delete
    SearchData 1, ""
    gnDataRow = -1
End Sub


Private Sub listData_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    If listData.Text = "" Then
        Exit Sub
    End If
    
    Dim arrStr() As String
    arrStr = Split(listData.Text, vbTab)
    gnDataRow = Int(arrStr(0))
    txtName.Text = arrStr(1)
    txtMobile.Text = arrStr(2)
    txtPhone.Text = arrStr(3)
    txtAddr.Text = arrStr(4)
End Sub

[真實案例] 使用Excel + VBA實現通訊錄 (Tasker案例)

 今天我們要介紹如何使用Excel + VBA實現通訊錄APP

首先我們進入VBA編輯器畫面

按右鍵選擇插入自訂表單


先將表單的ShowModal改為False,如此一來可以一邊使用UserForm,一邊使用Excel功能否則UserForm出現時,Excel會沒辦法操作其他功能

接下來我們先將APP介面設計好

基本資料包括姓名、手機、住家電話與住址,並加入各自的搜尋按鈕

我們將搜尋功能包成一個函數,四種搜尋按鈕各自帶入比對欄位與參數

再來是新增、修改、刪除與資料ListBox

新增按鈕先檢查是否有輸入姓名,並確認名字是否有重複,若重複時確認使用者是否真的要新增資料,然後將資料加入最後一列

刪除與修改功能要先確定使用者有從listbox選中資料,方便我們知道要改的是哪列資料

接著我們在Excel開啟時,要顯示APP分頁,並且秀出表單

並且在分頁切換時,去顯示/隱藏表單



操作影片


[程式碼] 使用Python 爬取內政部戶政司提供之全國門牌資料 (PTT CodeJob案例)

import requests

url = "https://www.ris.gov.tw/info-doorplate/app/doorplate/dateQuery"


data = {

  "searchType": "date",

  "cityCode": "63000000",

  "tkt": "-1",

  "areaCode": "63000010",

  "village": "",

  "neighbor": "",

  "sDate": "001-01-01",

  "eDate": "110-03-25",

  "_includeNoDate": "on",

  "registerKind": "0",

  "floor": "",

  "lane": "",

  "alley": "",

  "number": "",

  "number1": "",

  "ext": "",

  "_search": "false",

  "nd": "1616602191259",

  "rows": "20",

  "page": "1",

  "sidx": "",

  "sord": "asc",

  "token": ""

}


r = requests.post(url, data=data)

r.encoding='utf-8'

f = open(r'dump.txt', 'w', encoding="utf-8")

f.write(r.text)

f.close()


[真實案例] 使用Python 爬取內政部戶政司提供之全國門牌資料 (PTT CodeJob案例)

今天我們要介紹如何使用Python爬取內政部戶政司提供之全國門牌資料

首先讓我們連到文章內的網址

點右鍵觀看程式碼,先搜尋"現有村里街路門牌查詢"關鍵字串

我們可以發現在網頁原始碼中,找不到該字串,因此可以判斷網頁某些內容是需要執行過Javascript後,才會是完整內容

在點選"以編釘日期、編釘類別查詢"按鈕後,來到縣市選擇頁面,但是我們發現網址並沒有改變,所以無法單純利用網址跳轉方式來操作

按下F12觀看網路操作,發現有進行一個POST動作

請求內容為使用日期作為搜尋條件

點選臺北市後,看到有對另外一個網址進行POST

請求內容除了剛才的日期以外,還多了一個城市編碼

填好想要的條件之後,點選搜尋


請求發出後,就會回應我們相關的內容

當我們點選下一頁時,POST的需求也跟著改變

我們已經找出資料是由dataQuery這個網址所回應,因此我們要爬資料只需要照著需求填寫,再利用POST功能取得資料就可以了

最後我們來比對一下網頁資料與抓下來的內容
v1 部分是門牌資料,v2是編訂日期,v3是編訂類別




操作影片



 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Blogger Templates