JSA宏插入嵌入式图片

宏编辑器插入嵌入式图片

注意:不加延迟不行,延迟少了不行。我电脑上600毫秒也可以

function deletePicture(){		
Application.Workbooks.Item(1).Worksheets.Item(1).Activate();	
let basex = ActiveWindow.PointsToScreenPixelsX(0);	
let basey = ActiveWindow.PointsToScreenPixelsY(0);	
let dpiX = Application.ExecuteExcel4Macro(`CALL("user32","GetDpiForWindow","JJ",${Application.Hwnd})`)		
let shapes = Application.Worksheets.Item(1).Shapes;	
let izoom = ActiveWindow.Zoom;    //excel的缩放率		
let cellheight = 50;	
let cellwidth =12 ;			
let srows = 1;	
let scolumns =2;	
let drows = 10;	
let dcolumns = 2;	
for(var i = srows;i<=drows;i++ ){		
for(var j=scolumns;j<=dcolumns;j++){						
ActiveSheet.Cells.Rows.Item(i).Columns.Item(j).Select();			
var topp =  ActiveSheet.Cells.Rows.Item(i).Columns.Item(j).Top + 10;			
var	leftp = ActiveSheet.Cells.Rows.Item(i).Columns.Item(j).Left + 10;						
console.log(topp,leftp)			
var x = parseInt(basex + leftp * izoom/100 * dpiX/72);			
var y = parseInt(basey + topp * izoom/100 * dpiX/72);	
//			console.log(x,y)			
x=x+20;			
y=y+20;			
var shape = shapes.AddPicture("D:\\1.png",msoTrue,msoTrue,leftp,topp,-1,-1);							
shape.Select();				
Application.ExecuteExcel4Macro(`CALL("user32","PostMessageA","JJJJJ",${Application.Windows.Item(1).Hwnd},516,2,${y<<16|x})`);					
Application.ExecuteExcel4Macro(`CALL("user32","PostMessageA","JJJJJ",${Application.Windows.Item(1).Hwnd},517,0,${y<<16|x})`);												
Application.ExecuteExcel4Macro(`CALL("user32","PostMessageA","JJJJJ",${Application.Hwnd},256,82,0)`);			
Application.ExecuteExcel4Macro(`CALL("user32","PostMessageA","JJJJJ",${Application.Hwnd},257,82,0)`);			
//ActiveSheet.Rows.Item(i).RowHeight = cellheight;			
//ActiveSheet.Columns.Item(j).ColumnWidth = cellwidth;			
JSASLEEP(1000)			
//sleep(200)		}		}	
}

在shape.select前加入裁剪:

shape.PictureFormat.CropTop = 90;

shape.PictureFormat.CropBottom = 345;

shape.PictureFormat.CropLeft = 10;

shape.PictureFormat.CropRight = 340;

shape.Left = leftp;

shape.Top = topp;

同时,

var topp 最后的数值10改为5

var leftp 最后的数值10改为5

x=x+20语句改为x=x+10

y=y+20语句改为y=y+10

主要是图片小了,需要更精准定位

function JSASLEEP(ms)

{

//延时,毫秒。

const end = Date.now() + ms;

while (Date.now() < end) {

DoEvents();

}

}

黑龙江省
浏览 255
收藏
2
分享
2 +1
21
+1
全部评论 21
 
√Max
这与右键“图片嵌入单元格”命令有什么区别呢?
· 四川省
回复
恰同学少年
批量的区别而已。
· 黑龙江省
回复
 
恰同学少年
这是真正大佬用的方法 function test(){ let rgex = Range("A1").GetRangeEx() rgex.InsertCellPicture("fullpath/test1.png") }
· 黑龙江省
回复
 
wils
wils

创作者俱乐部成员

以前看到过用sendkey模拟右键,但那个会卡住,还需要用ontime定时点击r才行,这个厉害 不过如果只是插入,论坛里有例子用的RangeEx.InsertCellPicture
· 海南省
回复
恰同学少年
我知道那个API。但我就想试试这个方法。
· 黑龙江省
1
回复