設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 1725|回復(fù): 2
打印 上一主題 下一主題

[與其它組件] 色空間、極坐標(biāo)以及那些ChatGPT無法解決的問題——保存Excel對象為圖片

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2023-5-8 05:28:48 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
先說需求:輸入任意一組指定范圍的數(shù)X、Y(以下稱為“像素點(diǎn)”),例如,像素點(diǎn)為(30,-100),要求它落在這個彩色圓(這個又叫色空間,以下稱為“色空間”)的內(nèi)部;再輸入像素點(diǎn)為(-50,60),要求它也落在色空間內(nèi)部,應(yīng)該怎么做?

答:將直角坐標(biāo)系下,像素點(diǎn)的值轉(zhuǎn)為極坐標(biāo)系所對應(yīng)的值。這樣一來,極徑就等于sqrt(power(X,2)+power(Y,2)),任意像素點(diǎn)都會落在色空間內(nèi)部。直角坐標(biāo)系只需要設(shè)置為一個單位圓即可。

這是一個朋友向我提出的問題,思路只是初步。因?yàn)檫有更麻煩的事情:怎么在窗體上把它呈現(xiàn)出來。
當(dāng)時有兩三種方法。
1、將像素點(diǎn)轉(zhuǎn)為圖像對象,添加到色空間圖片上,合成圖片后輸出。這個方法Python很容易處理,但VBA很麻煩,需要聲明一大堆win32 API函數(shù)。
2、使用第三方插件,例如echarts,在極坐標(biāo)上繪制散點(diǎn)圖。這個在技術(shù)上很容易實(shí)現(xiàn)。問題是,怎么保證這些點(diǎn)落在色空間里面?那就得調(diào)整echarts圖表的坐標(biāo)軸與色空間的一致對齊。而這需要調(diào)整的時間就很長了。重點(diǎn)時,echarts坐標(biāo)軸并不方便平移(對,是平移,不是插隊(duì))。
3、在Access中繪制散點(diǎn)圖,再設(shè)置背景圖為色空間圖,進(jìn)行疊合。最后同樣遇到方法2的問題,沒法對齊。因?yàn)楫?dāng)刪除坐標(biāo)刻度、圖表標(biāo)題之類時,坐標(biāo)軸會自動王左上角移動。
4、在Excel里疊加。設(shè)置圖表背景透明后,很容易實(shí)現(xiàn)。接下來只剩一個問題:怎么把疊合后的圖片更新到窗體上。

這個問題,從下午開始問到晚上,chatGPT始終沒答對。這個就是chatGPT的局限性了:如果網(wǎng)上有很多例子,它可以回答得很準(zhǔn),而資料較少時就難免搜不到,那只好一本正經(jīng)地胡說八道了。
比如,它提供的代碼里始終用shape.export來導(dǎo)出圖片。而事實(shí)上,這個方法僅限于單個圖表(chart),其它類型。比如與圖片組合的圖表,或者圖片,都沒有這個方法。

我是找到了站長的大作(http://ctxi.cn/article-15042-1.html),抄過來,然后稍稍改一下才解決的。是的,不能直接export,需要設(shè)置圖片的文件頭之類。
(感謝TVB,感謝Parco,感謝站長,還有眾多支持我的粉絲
產(chǎn)品如下所示(請留意右下角的小白點(diǎn)):


——2023-5-8 13:22 更新:應(yīng)朋友要求,添加了保護(hù)工作表。
這里科普一下保護(hù)工作表的做法(會操作的請直接下拉頁面到附件位置):
先全選所有單元格,解除鎖定:

再選擇需要保護(hù)的單元格,進(jìn)行鎖定:

最后設(shè)置解鎖密碼:

——2023-5-9 15:26 更新:應(yīng)朋友要求,添加L值,按LAB計(jì)算。

--------------------------------我是分割線--------------------------------

朋友說,應(yīng)該加上Excel錯誤處理,避免打開一個文件多次出現(xiàn)彈窗。
其實(shí)這個問題我也考慮過,一般用GetObject和CreateObject來查找是否打開了Excel。如果打開了急用GetObject,如果沒打開就用CreateObject。示例代碼如下:
  1. Dim exl As Excel.Application
  2. Dim wb As Excel.Workbook

  3. On Error Resume Next '忽略錯誤

  4. Set exl = GetObject(, "Excel.Application") '查找一個正在運(yùn)行的 Excel 拷貝

  5. If Err.Number <> 0 Then '如果 Excel 沒有運(yùn)行則
  6.     MsgBox Err.Description
  7.     Set exl = CreateObject("Excel.Application") '運(yùn)行它
  8. End If
  9. Err.Clear ' 清除發(fā)生錯誤的 Err 對象


  10. Set wb = exl.Workbooks.Open(strExcelFileName)
  11. 以下從略……
復(fù)制代碼

但問題是,處理完數(shù)據(jù)后,是否需要退出Excel程序?如果用戶正好打開了一個別的Excel文件,退出程序,可能會影響她/他的工作(比如文件還沒保存)。如果不退出,那么還是會駐留在線程里,這和代碼報(bào)錯后沒法退出Excel進(jìn)程沒什么區(qū)別。


順帶問一下,大家一般是怎么處理的?

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享1 分享淘帖 訂閱訂閱
2#
發(fā)表于 2023-5-8 08:21:47 | 只看該作者
感謝分享,學(xué)習(xí)學(xué)習(xí),
3#
發(fā)表于 2024-5-3 22:12:48 來自手機(jī) | 只看該作者
謝謝分享!
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機(jī)版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2024-10-23 06:32 , Processed in 0.103646 second(s), 27 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表