2026年8月29日 星期六

HTML 說明檔案(CMH) 轉成 Web

目前辦公室的文件(如員工手冊、技術文件)多以 Word 或 PDF 格式存放。然而,對於生產線上的直接員工或現場作業人員而言,這類檔案在瀏覽與索引上並不直觀,加上多數現場員工並未配發專屬電腦,使得文件查閱與資訊傳遞變得相對不便。

理想的文件瀏覽介面應類似傳統的 CHM (Compiled HTML Help) 格式:左側為層級分明的大標題目錄,右側為詳細內容,並以 Web 網頁形式在瀏覽器中共享,提供如網頁般熟悉且便捷的操作體驗。

整體的轉換路徑為:Word 檔案 → CHM 格式檔案 → HTML 網頁

為了找出合適的轉換方案,實際測試了以下幾款工具:

  • chmProcessor(首選推薦): 操作簡單直覺,且為 Open Source 開源免費軟體。

  • Softany WordToHelp 轉換功能可用,但為付費軟體($249 USD)。

  • HelpNDoc 介面豐富,但未直接找到合適的 DOC 轉 HTML 功能,付費軟體($120 USD)。

  • Word2chm 介面過於陽春、像未完成的工具,不推薦。

  • FarHTML   : 設定與操作較為複雜,為付費軟體。

常見問題 Q&A

  • CHM 檔案如何開啟? Windows 作業系統已內建專屬關聯程式 hh.exe,可直接用來自動開啟並閱讀 .chm 檔案。

  • 後續自動化更新?   檢查目錄中的文件是否有更新,由使用者上傳Word檔後,系統自動更新為HTML格式的工具工具推薦   WinFolderChangesView ,檔案更新後直接以command方式執行chmProcessor更新HTML。


chmProcessor   程式界面

chmProcessor   程式界面
chmProcessor   程式界面

chmProcessor   程式界面
chmProcessor   程式界面


範例成品


2026年8月3日 星期一

Chrome 網站自動播放聲音

最近初初再學習日文,在查詢 Forvo 網站的單字發音時,發現每個單字通常都有多位網友提供的音檔。如果需要一個一個手動點擊聆聽,實在缺乏效率且沒有耐心。

剛好試試網頁自動化的工具: 油猴 (篡改猴) ,寫完的 JS先在 Chrome 的 F12 Console 中測試,當時一切正常,音檔能夠一個接一個順利播放。但是從油猴執行時,腳本卻卡住不動。直到手動按下其中一個 Play 按鈕後才會開始啟動。

原來是近年 Chrome 為了防止網站載入時自動播放影音而影響使用者體驗,預設會阻擋未經手動互動的自動播放行為。

經過測試,從網路上找到最簡單的解法是直接將網站加入 Chrome 的音效白名單中。設定方式如下:

  • 功能路徑: 在網址列輸入 chrome://settings/content/sound,即可將目標網站指定加入允許發出聲音的白名單中。



-  參考資料  Chrome 自動播放政策

-  自動撥發所有 forvo 音檔 / Gemini 產生 JS
// ==UserScript==
// @name         forvoAllPlay
// @namespace    http://tampermonkey.net/
// @version      2026-08-04a
// @description  Click all "Play" in the page
// @author       E1 Taiwan
// @include      https://zh.forvo.com/word/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=forvo.com
// @grant        none
// ==/UserScript==

function anchorclick(node)
{
    var evt = document.createEvent("MouseEvents");
    evt.initMouseEvent("click", true, true, window,
                       0, 0, 0, 0, 0, false, false, false, false, 0, null);
    var allowDefault = node.dispatchEvent(evt);
}


(function() {
    'use strict';

    // 詢問是否執行
    if (!confirm('是否要開始自動點擊播放按鈕?')) {
        console.log('使用者已取消執行。');
        return;
    }

    console.log('將在 3 秒後開始執行...2');

    // 等待網頁完全載入(含外部 JS 載入完成)
    window.addEventListener('load', () => {
        // 延遲 1.5 秒執行,確保 Forvo 官方的 Play 函數與音訊組件已完全初始化
        setTimeout(async () => {
            // 選擇頁面上所有發音按鈕
            const playButtons = document.querySelectorAll('.play');

            if (playButtons.length === 0) {
                console.log("[Forvo Player] 網頁載入完成,但未找到任何發音按鈕。");
                return;
            }

            console.log(`[Forvo Player] 偵測到 ${playButtons.length} 個發音,準備依序自動播放...`);
            console.log("[Forvo Player] 提示:如果語音沒聲音,請滑鼠點擊網頁任意處以解除瀏覽器自動播放限制。");

            // 依序播放每個發音
            for (let i = 0; i < playButtons.length; i++) {
                const btn = playButtons[i];

                // 擷取並清洗 onclick 內的 JavaScript
                let rawCode = btn.getAttribute('onclick');
                if (!rawCode) continue;

                let cleanCode = rawCode.replace(/return\s+false;?\s*$/, '');

                console.log(`[Forvo Player] 正在播放 (${i + 1}/${playButtons.length})`);

                try {
                    // 執行 Forvo 原生的播放函數
                    new Function(cleanCode)();
                } catch (e) {
                    console.error("[Forvo Player] 播放執行失敗:", e);
                }

                // 每個發音間隔 4 秒,避免語音重疊(可根據需求調整此數值)
                await new Promise(resolve => setTimeout(resolve, 3000));
            }

            console.log("[Forvo Player] 所有發音已播放完畢。");
        }, 1500);
    });
})();

2026年7月29日 星期三

內部 IIS 設定 SSL

Chrome 及大部份的瀏覽器對於沒有安裝HTTPS 的網站,都會出現警告甚至想連進去都要半強迫連線。對於一些小網站或是沒有資安考量的資料分享網站的確是件麻煩事,重點是得花錢買SSL憑証,這種類似過路費的方式我覺得又是商人的手法。

平常公司內部,只開放內網連線網站也要安裝SSL倒是有點畫蛇添足,中小企業內部使用的網站通常會用IP直連,例: http://192.168.0.1/erp,或是直接用主機名稱連線 http://server/erp,這時連線內部網站就出現沒有 HTTPS的警告,只能找些簡單的方式,不花錢的方式設定SSL憑證。此次就試著設定IIS+HTTPS的步驟作個記錄。

 1 設定 DNS 新增網址

設定 DNS 新增網址


2 設定 IIS HTTPS 網站




3 執行 win-acme 安裝 Let’s Encrypt 憑證

憑證有效日期是三個月,可以手動更新或是建立 schedule task 自動更新。

4 設定 router NAT RTF8207W-E



參考資料:  https://ithelp.ithome.com.tw/articles/10260641 

2026年4月24日 星期五

Vue 引用錯誤: Missing ref owner context. ref cannot be used on hoisted vnodes.

- 錯誤訊息
[Vue warn]: Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function. 

  - 引用前端插件 
Vue: v3 
chart.js: v4+ 
vue-chartjs: v5+ 

  - 說明 
此測試程式是 CDN 方式,以輕前端方式開發,所以手動引用 plug-in。初期猜測是程式中的語法造成此錯誤,但多方 try-error 加上網路上資料後仍不得解。 有中國網友 PO 文提到這個問題,但說明不太清楚還是卡在這個錯誤無法產生圖表。最後心血來潮將 vue-chartjs 引用 ESM 改為一般的 JS 檔案,順利解決。 



    


- 參考資料 
解决vue-chartjs在ESM模块导入时出现的引用错误问题 https://blog.gitcode.com/8eb95d906b3286a46aee671826e0d9f8.html

2020年5月13日 星期三

WeMos D1 測試 OUTPUT 錯誤

最近測試一塊WeMos D1 WiFi Arduino UNO 開發板ESP8266,測試輸出時總是失敗,一下懷疑板子問題,一下懷疑電源問題。總算找到這個微不足道的解法:配合接腳號由 4 改為 D4。

2018年11月18日 星期日

VS2017 打包安裝檔問題–管理者權限

Win10 的安全性比較嚴謹,自行開發的程式安裝後執行會出現漏斗轉個幾下就停止了,這個況狀還不是出現程式無回應就是 Win10 直接就結束程式。最簡單的解決方式是在圖示上按右鍵選擇:以系統管理員身份執行
image
不過要請使用者每回都要選擇”以系統管理員身份執行”,的確是有些麻煩。經過網路找解法,試過 app.manifest 中設定 requireAdministrator,但程式仍直接被 Win10 關閉。最後找到直接寫 code 提示使用者需要系統管理員權限的題示畫面,但使用者只要按下 “是” 就可以執行。
image

以下 sample code 來源: https://dotblogs.com.tw/alexwang/2016/09/21/234628
 [STAThread]
        static void Main()
        {
            var wi = WindowsIdentity.GetCurrent();
            var wp = new WindowsPrincipal(wi);

            if (!wp.IsInRole(WindowsBuiltInRole.Administrator))
            {
                var processInfo = new ProcessStartInfo();
                // The following properties run the new process as administrator
                processInfo.UseShellExecute = true;
                processInfo.FileName = Application.ExecutablePath;
                processInfo.Verb = "runas";

                // Start the new process
                try
                {
                    Process.Start(processInfo);
                }
                catch (Exception ex)
                {
                    // The user did not allow the application to run as administrator
                    MessageBox.Show("Sorry, this application must be run as Administrator.\n" + ex.Message);
                }

            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form2());
            }
        }

2018年8月14日 星期二

C# 小撇步

C# 6.0 dictionary 初始化的新寫法

var dict = new Dictionary<string, int>
{
    ["one"] = 1,
    ["two"] = 2,
    ["three"] = 3
};

2018年7月31日 星期二

.NET MapHttpRoute 與 MapPageRoute

需求: URL 輸入 http://xxxx/yyy 轉成 http://xxxx/yyy.html

最近趕流行,用 vue 寫了一個 SAP(Single application page),html網頁在 MVC 的架構下可成功執行,但我就是想讓使用者操作上更方便,只要輸入網址 route 就直接跳轉到此 html 頁面。如果照原本 MapHttpRoute的方式會造成 .NET 出現找不到 Controller 的問題。最後發現不用 MapHttpRoute 去解此問題,使用MapPageRoute才是正解。

            // Web API routes
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );


以下增加於 Global.asax.cs  

    public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            // Code that runs on application startup
            GlobalConfiguration.Configure(WebApiConfig.Register);
            // 新增加以下 route 
            RegisterRoutes(RouteTable.Routes);
        }
        void RegisterRoutes(RouteCollection routes)
        {
            routes.MapPageRoute("",
                        "yyy", "~/yyy.html");
        }
    }

Web.Config 加上對應的 extension
<compilation debug="true" targetFramework="4.5.2">
<buildProviders >
<add extension=".html" type="System.Web.Compilation.PageBuildProvider"/>
<add extension=".htm" type="System.Web.Compilation.PageBuildProvider" />
</buildProviders >
</compilation>

2018年5月10日 星期四

泰國佛曆 System.Globalization.CultureInfo

手上有個泰國的生產系統小案子,
雖說是個小案子但也算是跨國專案,
我遇到除了語言不同之外的電腦系統文化差異,
平常我們使用電腦的日期格式一般主要為2018/5/10,
美國系統的國家則是 5/10/2018,也就是 MM/dd/yyyy。
但泰國的使用曆別是一個本人未曾耳聞的佛曆,
就是釋迦牟尼佛滅度(涅槃)當年度為計算基準,
西元2018年就是泰曆/佛曆2561年,年度不同就算了還有四年一次閏年。
真要弄起來那就頭疼了。

不過在網路上找到一個小解法,
執行的程式強制指定CultureInfo,
為了這個設定我可是弄到凌晨三時多,真是工程師的悲哀。
以下為其語法,分享給作泰國專案的網友們。

string theCultureString = “zh-TW”; // 台灣南波萬
System.Globalization.CultureInfo ci = new CultureInfo(theCultureString); Thread.CurrentThread.CurrentCulture = ci; Thread.CurrentThread.CurrentUICulture = ci;


加碼再作個記錄,此專案使用到一個強大元件:GrapeCity Spread
雖然事前設定CurrentThread的CultureInfo,
但日期資料在輸入時仍有被我佛慈悲的佛曆帶著走,
還是得強迫在 cell 設定CultureInfo處理日期。

// 強制使用台灣 Culture, 避免泰國佛曆造成衝突 
string theCultureString = "zh-TW" System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo(theCultureString); datecell.SetCurrentCulture(ci);

image
佛曆設定方式

資料來源:
https://stackoverflow.com/questions/468791/is-there-a-way-of-setting-culture-for-a-whole-application-all-current-threads-a

2018年4月21日 星期六

MSSQL CDC (Change Data Capture) 更新記錄

開發系統時,使用者常常會問可以知道資料是被那個員工更新的,更新什麼內容嗎?通常我都會回答系統會記錄Log時間,資料異動者都查詢的到,但是異動那一個欄位就沒辦法了,實在也不想為這個很少使用的功能再大費周張去寫程式作欄位比較再存到log去。

今天碰巧查個MSSQL的資料,才發現MSSQL 2008 就有類似的功能了,還不用寫程式作些設定就可以達到這個功能,以下就是這個CDC (Change Data Capture) 的簡單實測記錄。

-- CDC = Change Data Capture
-- 執行 CDC, sp_cdc_enable_table 為 enable, sp_cdc_disable_table 為 disable
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'items',
@role_name = NULL

GO
-- 觀察修改前、後差異
select * from cdc.dbo_items_CT

-- 目前 DB 中有那些 table 被 tracking 
SELECT [name], is_tracked_by_cdc FROM sys.tablesGO

-- CCD 設定多久會清除, 預設為 4320 分鐘或 3 天,  最大值為 52494800 (100 年)
select retention, threshold
from msdb.dbo.cdc_jobs
where database_id = db_id()
and job_type = N'cleanup'

2018年3月23日 星期五

SmartASP.net 搬家紀實

我手上有一個對外的網站是從幾年前就租用的美國Godaddy - Windows Hosting,當初租用Godaddy的原因及特點是無流量限制,檔案空間不限速度也還可以,但對我來說有個最致命的一點就是MySQL的DB容量限制,1GB。這個1GB搞的我很麻煩,系統資料庫每週都會更新資料,就會越長越大,但舊資料也不能刪除,所以一超過這個限制就提心吊膽會被Godaddy無情的封鎖。對,我曾經被封鎖過,還必須郵件往返才解決問題。

話說今年(2018)三月剛好租用的Godaddy Hostoing又要到期,心一橫來搬家。但Linux Hosting好找、Windows Hosting難尋,找了貴到離譜的台灣Hosting,系統爛還有流量限制,也試用價格不便宜的GCP,但C/P值都不理想。最後在某網站看到推薦SmartASP.Net,MySQL的限制是10GB,足足比Godaddy的1GB大了10倍,流量也不限制就連價格也差不多,所以我直接買了一般共用空間的最高等級Premium Plan,價格是漂亮的$7.95/月。

不過最重要的搬家花了不少時間處理MySQL技術問題,以下稍微作點記錄。

MySQL Connection限制
錯誤訊息:User 'a34322_n1' has exceeded the 'max_user_connections' resource (current value: 10)

原來SmartASP.Net的MySQL有Connection限制,但他們也太小看我的網站了,輕輕鬆鬆就突破這個限制,爆了。所以本來買的是.NET Advance plan就改昇級到Premium plan,價差不大可以接受。但請注意昇級後,要去按網站上的一個按鈕:[Upgrade to 20] <— 但…我的網頁上就沒這個按鈕,只能開Ticket請客服幫忙手動增加。以下是四個plan的connection限制,在Knowledge base才有得查。

  • .NET Basic plan - 10 MAX
  • .NET Advance plan - 10 MAX
  • .NET Premium plan - 20 MAX
  • Semi plans - 40 MAX

另外'max_user_connections' 也延伸出另一個問題,就是網站平時20個connection都是滿的,那平常要怎麼維護或是自動更新資料呢?因為大部份時間都被user佔滿了。原本以為又沒解了,但想了一夜後發現原來.NET Premium plan有開放一個功能”Extra DB Users”,有了這個金牌功能就可以另外再加DB user,而'max_user_connections'是跟著DB user走,所以開新DB User就有獨立的 connection 數可以用,就將系統用的DB user和維護的DB user分作不同帳號解決。

2018年3月13日 星期二

TSC 條碼機 QR Code 列印中文亂碼

客戶使用 TSC 條碼機列印標籤,正常列印QR Code時如果內容有中文時,刷條碼會出現亂碼無法閱讀。我查詢QR Code 的規格是允許中文字元,但如果依照原廠文件使用以下方法列印則不可行,印出來還是亂碼。其中第二種方式的 B0006 為 Binary + 4碼字元長度,目前只能使用第三種方式,但中文需先轉為 4字元的 Unicode。

更新: 最後問題點竟是 SCLIB_DLL 的版本問題造成中文亂碼。

Unicode 編碼字元查詢:http://jicheng.tw/hanzi/unicode.html?s=7000&e=7FFF

方式一(亂碼):
LIB_DLL.sendcommand("QRCODE " + QRCodeX + ", " + QRCodeY + ",H,2,A,0,M2,S7,"中文");

方式二(亂碼):
SCLIB_DLL.sendcommand("QRCODE " + QRCodeX + ", " + QRCodeY + ",H,2,A,0,M2,S7," B0006+中文 Unicode 內碼");

方式三(正常中文):
var cmd = 'QRCODE 60,30,H,7,A,0,M2,S1,\"\u7f16\u7801\"'; 

資料來源: http://blog.csdn.net/u010121228/article/details/72866417

2018年2月27日 星期二

CentOS 7 Minimal 版本基本設定

安裝環境為 Oracle VM VirtualBox
=============================================
  設定開機啟動網卡
=============================================
/etc/sysconfig/network-scripts
vi ifcfg-enp0s3
# edit ONBOOT=yes   <-- 改為 yes
=============================================
  更新系統及常用套件
=============================================
更新系統:yum -y update
常用套件:yum install vim wget net-tools epel-release
=============================================
  時區設定
=============================================
# Timezone
查看所有時區:
# timedatectl list-timezones
設定時區區域:
# timedatectl set-timezone Asia/Taipei
與NTP server同步:
# timedatectl set-ntp yes
=============================================
  安裝 telnet
=============================================
yum install telnet-server.x86_64
yum install telnet.x86_64
yum install xinetd.x86_64
yum install xinetd

安裝完成後,將xinetd服務加入開機自啟動:
# systemctl enable xinetd.service
將telnet服務加入開機自啟動:
# systemctl enable telnet.socket
最後,啟動以上兩個服務即可:
# systemctl start telnet.socket
# systemctl start xinetd(或service xinetd start)
如果還不能Telnet關閉防火墻
systemctl start firewalld.service #啟動firewall
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啟動

* 注意: 使用 PuTTY SSH 連線 telnet
====================================
  增加使用者
====================================
adduser e1
passwd e1
=============================================
安裝網路設定命令工具(非必要)
=============================================
#系統設定套件 - setup 工具包
yum -y install setuptool
#系統設定套件 - 服務套件
yum -y install ntsysv
#系統設定套件 - 網路管理
yum -y install system-config-network-tui
#系統設定套件 - 防火牆設定
yum -y install system-config-firewall-tui
#系統設定套件 - 安全性設定
yum -y install system-config-securitylevel-tui

=============================================
立即手動更新所有預先安裝的軟件
yum -y update
自動執行指令
yum -y install cronie
yum -y install yum-cron

systemctl start crond
systemctl start yum-cron
==============================================

2017年10月19日 星期四

Dapper 查詢結果轉 DataTable

手上某專案使用了GrapeCity的Spread for WinForm,使用Dapper查詢資料,得到結果後使用 foreach 方式一筆一筆填入。資料不大的話就相安無事,執行速度也可以接受。但是,就是有支關鍵的WinFom為了快速顯示,使用了DataAdapter轉DataTable,只好 Google Dapper 和 DataTable 的資料,並沒有查到可以直接轉出到DataTable,在下運氣好,在日本的某個論壇有個專家解了,方式如下,請放煙火後享用。

dt = new DataTable();
dt.Load(db.ExecuteReader(sql, new { })); 

2017年3月5日 星期日

[VisualBox] 無法共用剪貼簿

VisualBox 是 Oracle 佛心來給眾生免費使用的虛擬主機程式,就像是 MS 的 Hyper-V 功能一樣。一直使用這個軟體二、三年了,作測試或是作開發環境都很正常,但 VisualBox 無法共用剪貼簿的問題困擾我好久,算是這個問題不大,心裡就是湊合著用就用,等到每次要用到剪下、貼上時嘴巴就哼個二聲,說這個軟體真爛。

而昨天我就真的認真了,直接上 Stack overflow 找答案,原來只要安裝 Guest Additions CD 就可以啟用「共用剪貼簿」了,Guest Additions CD 的映像檔就在以下的第二張圖哦,請安心服用。

image

 

image

2017年2月22日 星期三

[VBA] 自動化產生圖表 (Chart)

實際運作擷圖

VGA-Chart

第一次在部落格中記錄 VBA 程式,因為最近有個需求,來源是客戶每週有個重要任務:整理公司的生產統計資料並產生多種不同圖表於 Weekly review會議中報告,而這些圖表包含有 Pie、Line圖等。
客戶久而久之發現整理這些資料很花時間,重覆性很高,聽別人說有 Excel VBA ,可以將原本手動的工作改為程式處理,以後只要執行程式就可以自動產生出圖表。沒錯,這個客戶的觀念非常正確,Excel VBA 就是這樣好用,如果你是Excel的重度使用者,常常有一些計算或是統計的任務或許可以考慮將這些工作交由程式處理,以自動化的方式處理。那你省下來的時間呢?當然是去作更重要的事情啦!
image 

以下是這次 VBA 的部份程式,我擷取部份精華下來作為記錄也分享給大家。
image
image
第1部份:原始資料(Raw data) 產生樞紐分析表
'=====================================================
'2.Create Pivot table
'=====================================================
'Where do you want Pivot Table to start?
StartPvt = shtName & "!" & Range("A2").Address(ReferenceStyle:=xlR1C1)
'Create Pivot Cache from Source Data
Set pvtCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=SrcData)
'Create Pivot table from Pivot Cache
Set PT = pvtCache.CreatePivotTable(TableDestination:=StartPvt, TableName:="PivotTable" & shtName)
  
'在新的PivotTable上設置欄位
With PT
'欄
    .PivotFields("Region").Orientation = xlRowField
'資料
    .PivotFields("NO").Orientation = xlDataField
'可以設定各欄位的顯示與否
    With .PivotFields("Page Two.RMA Region")
        .PivotItems("(blank)").Visible = False
    End With
End With
'建立樞紐分析表會顯示出其命令列, 關掉它
Application.CommandBars("PivotTable").Visible = False
第2部份:樞紐分析表轉為 Pie 圖表
'=====================================================
'3.Create Chart
'=====================================================
Set objChart = Charts.Add
With objChart
    .ChartType = xlPie
    .SetSourceData Source:=Sheets(shtName).Range, PlotBy:=xlColumns
    .Location Where:=xlLocationAsObject, Name:=shtName
End With
'Chart 定位, 大小
With ActiveChart.Parent
    .Left = 200
    .Top = 50
    .Width = 450
    .Height = 350
End With
'DataLabel 及 Title
With ActiveChart
    .HasTitle = True
    .ChartTitle.Text = "By Region"
    .ApplyDataLabels xlDataLabelsShowPercent
    .SeriesCollection(1).DataLabels.NumberFormat = "##0.00%"
End With
第3部份:Pie 圖表匯出到 PowerPoint,以下這段程式碼是由 G 大神來的
Sub ChartsToPresentation()
' Set a VBE reference to Microsoft PowerPoint Object Library
Dim PPT As PowerPoint.Application
Dim PPPres As PowerPoint.Presentation
Dim PPSlide As PowerPoint.Slide
Dim PresentationFileName As Variant
Dim SlideCount As Long
Dim iCht As Integer
' Reference existing instance of PowerPoint
Set PPApp = GetObject(, "Powerpoint.Application")
' Reference active presentation
Set PPPres = PPApp.ActivePresentation
PPApp.ActiveWindow.ViewType = ppViewSlide
For iCht = 1 To ActiveSheet.ChartObjects.Count
' copy chart as a picture
ActiveSheet.ChartObjects(iCht).Chart.CopyPicture _
Appearance:=xlScreen, Size:=xlScreen, Format:=xlPicture
' Add a new slide and paste in the chart
SlideCount = PPPres.Slides.Count
Set PPSlide = PPPres.Slides.Add(SlideCount + 1, ppLayoutBlank)
PPApp.ActiveWindow.View.GotoSlide PPSlide.SlideIndex
With PPSlide
' paste and select the chart picture
.Shapes.Paste.Select
' align the chart
PPApp.ActiveWindow.Selection.ShapeRange.Align msoAlignCenters, True
PPApp.ActiveWindow.Selection.ShapeRange.Align msoAlignMiddles, True
End With
Next
' Clean up
Set PPSlide = Nothing
Set PPPres = Nothing
Set PPApp = Nothing
End Sub

完整程式及測試檔案
https://drive.google.com/open?id=0B0pY4dpq6q9WZVZtZ21fbWNfMEU

2017年2月20日 星期一

[FB] 粉絲專頁管理員

剛在 FB 上花了十分鐘找不到粉絲專頁管理員的設定,趕快記下來免得下回又找不到了。

image

2016年7月1日 星期五

Access 2007 開啟時只顯示表單

客戶需求:
一般使用者進入 Access 2007 只顯示表單(Form),將資料表隱藏起來,並且無法直接存取資料表(Table)。避免一般使用者直接更改資料表內容。

經過 Google 查詢國內外的資料,確認只要加上以下的 code 於VBA程式碼,再重新啟動就看不到表單之外的資料。那開發人員或是管理者呢?處理方式為開啟Access檔案時,按下 Shift 鍵就會跳過以下程序。

Sub SetStartupProperties()
Const DB_Text As Long = 10
Const DB_Boolean As Long = 1
    ChangeProperty "StartupForm", DB_Text, "首頁"  ‘修改為啟動表單頁
    ChangeProperty "StartupShowDBWindow", DB_Boolean, False
    ChangeProperty "StartupShowStatusBar", DB_Boolean, False
    ChangeProperty "StartupMenuBar", DB_Boolean, False
    ChangeProperty "AllowShortcutMenus", DB_Boolean, False
    ChangeProperty "AllowBuiltInToolbars", DB_Boolean, False
    ChangeProperty "AllowFullMenus", DB_Boolean, False
    ChangeProperty "AllowBreakIntoCode", DB_Boolean, False
    ChangeProperty "AllowSpecialKeys", DB_Boolean, True
    ChangeProperty "AllowBypassKey", DB_Boolean, True
   
    DoCmd.ShowToolbar "Ribbon", acToolbarNo
    DoCmd.ShowToolbar "Status Bar", acToolbarNo
    DoCmd.NavigateTo "acNavigationCategoryObjectType"
    DoCmd.RunCommand acCmdWindowHide
   
End Sub

Function ChangeProperty(strPropName As String, varPropType As Variant, varPropValue As Variant) As Integer
    Dim dbs As Object, prp As Variant
    Const conPropNotFoundError = 3270

    Set dbs = CurrentDb
    On Error GoTo Change_Err
    dbs.Properties(strPropName) = varPropValue
    ChangeProperty = True

Change_Bye:
    Exit Function

Change_Err:
    If Err = conPropNotFoundError Then ' 找不到屬性。
     Set prp = dbs.CreateProperty(strPropName, _
     varPropType, varPropValue)
     dbs.Properties.Append prp
     Resume Next
    Else
     ' 未知的錯誤。
     ChangeProperty = False
     Resume Change_Bye
    End If
End Function

2016年6月20日 星期一

VS2013 failed to register URL 0x80070020

今天開啟一個久違的專案,無奈VS2013出現一個錯誤訊息:

vs2013 failed to register URL  0x80070020。

疑…上個月開專案不是好好的嗎?我的乖乖呢?網路上查了一些解決方式,研判是port被佔住造成無法執行VS2013內建的 IIS Express。但 VS2013的web port可不是說改就改的哦,修改方式我也幫你準備好了,請看以下步驟二。

步驟一、找出是否真的有程式佔用了port,123456是port編號。

netstat -a -n -o | find "123456"

 

步驟二、修改以下二個檔案內有關 port 的連結,換另一個port
  • C:\Users\[user name]\Documents\IISExpress\config\applicationhost.config
  • 專案.sln