喜歡攝影的我,喜歡到處拍拍照,吃點當地的特色食物。 跟朋友聊天之餘,推薦我寫成網誌跟大家分享。 沒外出的日子,喜歡在家當隱性宅,寫程式看看書,追劇。 希望我的手札文,不會讓你翻桌 XD
2024年12月31日 星期二
2024年12月30日 星期一
VBA:FORM 具備縮小、關閉按鈕
與chatgpt討論多次跟測試後,得到以下:
#If VBA7 Then
Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongPtrA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
Private Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hWnd As LongPtr) As LongPtr
Private Declare PtrSafe Function FindWindowA Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hWnd As LongPtr, ByVal nCmdShow As Long) As Long
#Else
' 32 位元系統使用這些聲明
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function FindWindowA Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
#End If
Private Const GWL_STYLE As Long = -16
Private Const WS_MINIMIZEBOX As Long = &H20000
Private Const WS_MAXIMIZEBOX As Long = &H10000
Private Const WS_SYSMENU As Long = &H80000
Private Sub UserForm_Initialize()
Dim hWnd As LongPtr
Dim lStyle As LongPtr
' 獲取 UserForm 的窗口句柄
hWnd = FindWindowA("ThunderDFrame", Me.Caption)
' 獲取窗口的當前樣式
lStyle = GetWindowLongPtr(hWnd, GWL_STYLE)
' 添加最小化和最大化按鈕
lStyle = lStyle Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX Or WS_SYSMENU
SetWindowLongPtr hWnd, GWL_STYLE, lStyle
' 刷新菜單欄
DrawMenuBar hWnd
End Sub
API 函數聲明區塊
GetWindowLongPtr 和 GetWindowLong:用於獲取窗口的屬性。
SetWindowLongPtr 和 SetWindowLong:用於設置窗口的屬性。
DrawMenuBar:用於刷新表單欄以應用新的窗口屬性。
FindWindowA:用於查找特定窗口的句柄。
ShowWindow:用於顯示或隱藏窗口。
常數聲明
GWL_STYLE:用於指定窗口的樣式屬性。
WS_MINIMIZEBOX、WS_MAXIMIZEBOX 和 WS_SYSMENU:分別表示最小化按鈕、最大化按鈕和系統表單。
UserForm 初始化過程
UserForm_Initialize 子程序:當 UserForm 被初始化時調用該子程序來添加最小化和最大化按鈕。
首先,通過 FindWindowA 找到 UserForm 的窗口句柄。
接著,通過 GetWindowLongPtr 獲取當前的窗口樣式。
然後,將最小化和最大化按鈕及系統菜單的樣式添加到窗口樣式中。
最後,使用 SetWindowLongPtr 設置新的窗口樣式,並通過 DrawMenuBar 刷新表單欄以應用更改。
vba:畫垂直線 解說版
新改好的:
Sub 巨集3V2(Name, rngXValues, 垂直線)
If InStr(Name, "Chart") > 0 Then
ActiveSheet.ChartObjects(Name).Activate
ActiveChart.PlotArea.Select
Application.CutCopyMode = False
Application.CutCopyMode = False
ActiveChart.SeriesCollection.NewSeries
ActiveChart.FullSeriesCollection(ActiveChart.SeriesCollection.Count).Values = "=" & ActiveSheet.Name & "!" & 垂直線.Address
ActiveChart.FullSeriesCollection(ActiveChart.SeriesCollection.Count).Name = "=""垂直線"""
ActiveChart.FullSeriesCollection(ActiveChart.SeriesCollection.Count).XValues = "=" & ActiveSheet.Name & "!" & rngXValues.Address
ActiveChart.Axes(xlValue).MajorGridlines.Select
ActiveChart.ChartArea.Select
ActiveChart.ChartType = xlColumnClustered
ActiveChart.FullSeriesCollection(ActiveChart.SeriesCollection.Count - 1).ChartType = xlLine
ActiveChart.FullSeriesCollection(ActiveChart.SeriesCollection.Count).ChartType = xlColumnClustered
ActiveChart.FullSeriesCollection(ActiveChart.SeriesCollection.Count).AxisGroup = 2
End If
End Sub
好的,讓我們逐一分別來解說這段 VBA 代碼。這段代碼的作用是:
主要功能是在 Excel 中的一個圖表裡添加一條垂直線。
這個子程序有三個參數:
Sub 巨集3V2(Name, rngXValues, 垂直線)
Name:圖表名稱
rngXValues:X 軸數據範圍
垂直線:垂直線的數據範圍
檢查圖表名稱:
If InStr(Name, "Chart") > 0 Then
如果圖表名稱包含“Chart”,則繼續執行。
選擇並啟用指定的圖表:
ActiveSheet.ChartObjects(Name).Activate
ActiveChart.PlotArea.Select
Application.CutCopyMode = False
增加新數據:
ActiveChart.SeriesCollection.NewSeries
ActiveChart.FullSeriesCollection(ActiveChart.SeriesCollection.Count).Values = "=" & ActiveSheet.Name & "!" & 垂直線.Address
ActiveChart.FullSeriesCollection(ActiveChart.SeriesCollection.Count).Name = "=""垂直線"""
ActiveChart.FullSeriesCollection(ActiveChart.SeriesCollection.Count).XValues = "=" & ActiveSheet.Name & "!" & rngXValues.Address
新增一個數據系列,並設置它的數據範圍為 垂直線。
設置這個數據系列的名稱為 “垂直線”。
設置 X 軸數據範圍為 rngXValues。
設定圖表類型:
ActiveChart.Axes(xlValue).MajorGridlines.Select
ActiveChart.ChartArea.Select
ActiveChart.ChartType = xlColumnClustered
ActiveChart.FullSeriesCollection(ActiveChart.SeriesCollection.Count - 1).ChartType = xlLine
ActiveChart.FullSeriesCollection(ActiveChart.SeriesCollection.Count).ChartType = xlColumnClustered
ActiveChart.FullSeriesCollection(ActiveChart.SeriesCollection.Count).AxisGroup = 2
設置圖表類型為群組柱狀圖。
將倒數第二個數據系列(即原有的數據)設為折線圖。
將新的垂直線數據系列設為次坐標軸。
結束條件結構與結束SUB:
End If
End Sub
2024年12月27日 星期五
2024年12月26日 星期四
VBA 畫垂直線
在折線圖上畫一個垂直線,然後是根據副軸座標來標示相同日期在主座標上
圖表名、X標籤資料位置,Y軸資料位置
Sub 巨集3(Name, rngXValues, 垂直線)
If InStr(Name, "Chart") > 0 Then
'Range("L17").Select
ActiveSheet.ChartObjects(Name).Activate
ActiveChart.PlotArea.Select
Application.CutCopyMode = False
Application.CutCopyMode = False
ActiveChart.SeriesCollection.NewSeries
ActiveChart.FullSeriesCollection(2).Values = "=" & ActiveSheet.Name & "!" & 垂直線.Address ' "=工作表3!$G$2:$G$148"
ActiveChart.FullSeriesCollection(2).Name = "=""垂直線"""
ActiveChart.FullSeriesCollection(2).XValues = "=" & ActiveSheet.Name & "!" & rngXValues.Address '"=工作表3!$A$149:$A$295"
ActiveChart.Axes(xlValue).MajorGridlines.Select
ActiveChart.ChartArea.Select
ActiveChart.ChartType = xlColumnClustered
ActiveChart.FullSeriesCollection(1).ChartType = xlLine
ActiveChart.FullSeriesCollection(2).ChartType = xlColumnClustered
ActiveChart.FullSeriesCollection(2).AxisGroup = 2
End If
End Sub
2024年12月25日 星期三
關箱文:我的雷達
密集測試半年成績 不再貼文更新
-
寫給自己速查 垂直屬性:HorizontalAlignment 水平屬性:VerticalAlignment 置中:xlCenter 靠左靠右:XLLEFT、XLRIGHT Sheets("工作表1").Range("m2").Ve...
-
美國實質可支配所得 利率與黃金 消費者信心 利率PK DW PK FED紐約分行 上海貨櫃指數 BDI CRB 美國m 1 m2 s&p 美國 非農 美國 非農就業職務空缺率 美國股市 行事曆 全球股市行事曆 全球股市 巴菲特指數 外銷訂單年增率 每月20號 外...
-
整理資料時,不免要判斷資料數量,在判斷資料時,資料有時會有不連續與連續資料,這時候判斷方式不盡相同 連續資料時: a行於65000儲存格以前的最後列,有點饒舌;應該是這樣看,從a65000往上找(xlup),找到的第一個儲存格,也相對於是a行在65000列之前最後一列。 END...