我正在将图像导入 Excel,并尝试计算图像的用户定义区域的平均颜色。为此,用户创建一个边界,然后循环遍历屏幕像素以查看它们是否落在该边界内 - 如果落在该边界内,则该像素的 RGB 会添加到集合中,然后在最后进行平均。
我基本上已经让这一切正常工作,但是由于某种原因我的代码像素颜色检测错误。应该是黄色或蓝色像素(或任何其他颜色)的像素被记录为灰色阴影(通常为 16777215 或 13948116,以 Windows 十进制值表示)。
我假设 PixelColor 函数有问题,该函数旨在获取我输入的 XY 坐标的像素颜色(例如 -1107 或 830 等值),但必须返回某些颜色其他像素。我尝试根据鼠标光标所在的像素检测颜色的代码进行调整,但在尝试为其提供 XY 坐标而不是从光标位置获取坐标时显然出现了问题。
获取像素颜色并转换为RGB的代码如下:
Private Declare PtrSafe Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare PtrSafe Function GetCursorPos Lib "user32" (ByRef lpPoint As POINT) As LongPtr
Private Declare PtrSafe Function GetWindowDC Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hwnd …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 VBA 选择数据透视表,但遇到了一个问题,即数据透视表可能从 A3(如果没有激活报告过滤器)或 A6(如果选择了 3 个报告过滤器)等开始。因此,数据透视表表格并不总是在工作表上的同一点上。清除数据透视表只会删除所有数据和报告过滤器,但不会将数据透视表移回其原始位置。有没有办法使用 VBA 来选择数据透视表(以便能够将数据复制并粘贴到新工作表中),而不管它在工作表上的位置?
谢谢。
更新 - 我已经想出了如何做到这一点。它真的很简单:
Dim PT As PivotTable
Set PT = ActiveSheet.PivotTables(1)
PT.TableRange1.Select
Run Code Online (Sandbox Code Playgroud) 我目前使用以下公式来查找范围中最常见的单词或数字:
=INDEX(E9:E18,MODE(MATCH(E9:E18,E9:E18,0)))
Run Code Online (Sandbox Code Playgroud)
但是,如果有任何空白单元格,则公式将返回一个空白单元格作为模式.如何修改它以找到忽略任何空白单元格的最常用单词/数字?
非常感谢
我可以使用VBA使用以下代码来创建簇状图表:
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlColumnClustered
Run Code Online (Sandbox Code Playgroud)
但是,这通常位于屏幕的中央。我可以使用以下代码移动它:
ActiveSheet.Shapes("Chart 1").IncrementLeft -650.4545669291
ActiveSheet.Shapes("Chart 1").IncrementTop -295.9091338583
Run Code Online (Sandbox Code Playgroud)
但是,这仅相对于其原始位置。是否可以将其设置为始终位于某个像素或单元格编号?换句话说,我可以对VBA进行编码以在工作表上的某个位置创建图表吗?
我想循环浏览PageField中的选定项目.我可以使用以下代码遍历每个数据项(在我的例子中,字母表字母):
Dim PT As PivotTable
Set PT = ActiveSheet.PivotTables(1)
Dim Letter As PivotItem
For Each Letter In PT.PivotFields("Alphabet").PivotItems
'Code for each letter of the alphabet
Next Letter
Run Code Online (Sandbox Code Playgroud)
但是,如果我只在PageField中选择了几个非连续动态字母(A,J,P,S,X),我该如何将循环限制为这些字母?
人们可以使用数据验证工具创建一个列表。但是,是否可以仅使用公式(而不是 VBA)来完成相同的操作?
如果我有一个由多个单元格 ( ) 组成的命名范围Names,我可以在另一个单元格 ( ) 中引用它=Names。但是,只会显示第一个单元格的内容,并且不会创建显示所有选项的下拉菜单。
有没有一种方法可以在没有 VBA 和数据验证的情况下做到这一点?
谢谢