Вы уверены, что Shape.Left не будет работать? Если все сделано правильно, все работает нормально. Попробуйте это так (C #):
//This assumes shape is already assigned to the shape you want to move
//and ws is assigned to the worksheet
//set cell to whatever cell you want to move the image to
Excel.Range cell = ws.Cells[10, 10];
int pixels = 40; //Number of extra pixels over from the left edge of the cell
shape.Left = ((float)cell.Left + pixels);
shape.Top = ((float)cell.Top);
Для VB это должно быть что-то вроде ниже, но я не эксперт VB
Dim pixels As Integer = 40
Dim cell As Excel.Range = ws.Cells(10, 10)
s.Left = (CSng(cell.Left) + pixels) 'Note: if using cell.Left you must cast as single
s.Top = CSng(cell.Top)
Редактировать: я только что создал тестовую программу в VB. Следующий код действительно перемещает мои изображения.
Dim oXL As Excel.Application
Dim oWB As Excel.Workbook
Dim oSheet As Excel.Worksheet
Dim oRng As Excel.Range
Dim oShape As Excel.Shape
' Start Excel and get Application object.
oXL = CreateObject("Excel.Application")
oXL.Visible = True
' Get a new workbook.
oWB = oXL.Workbooks.Open("*insert_valid_path_here*")
oSheet = oWB.ActiveSheet
For Each oShape In oSheet.Shapes
oShape.Left = oShape.Left + 9000
Next
' Make sure Excel is visible and give the user control
' of Excel's lifetime.
oXL.Visible = True
oXL.UserControl = True
' Make sure that you release object references.
oRng = Nothing
oSheet = Nothing
oWB = Nothing
oXL.Quit()
oXL = Nothing
Я подозреваю, что вы либо неправильно назначаете фигуру, либо ожидаете, что она будет в неправильном месте, либо неправильно сохраняете.