2017-11-15 21 views
2

ヘリコプター着陸サイト用の衛星画像をダウンロードし、サイトコードのタブに配置するExcelシートがあります。正確には166個あり、それぞれに2つの静的マップ画像があり、合計332個の画像があり、いくつかの方法でそれらを操作する必要があります。画像を操作する際にメモリを減らすExcel VBA

私はそれらをダウンロードして配置する問題はありませんが、私がそれらを操作しているときに私はメモリが足りなくなります。操作は、スクリーン上に表示されているので、地図を見ているときに私たちのパイロットが夜間によく見えるよう助けることです。

私は次のコードを入力して、約100枚まで動作し、32ビットExcelに制限されているためにRAMが不足しています。使用されているメモリの量を減らす方法はありますか?

Public Sub SwitchtoNight() 
    Dim oWS As Worksheet 
    For i = 5 To ThisWorkbook.Sheets.Count 
     Set oWS = ThisWorkbook.Sheets(i) 
     With oWS 
      .Shapes("GoogleMap1").Fill.PictureEffects.Insert(msoEffectSaturation).EffectParameters(1).Value = 0 'Saturation 
      .Shapes("GoogleMap1").Fill.PictureEffects.Insert(msoEffectBrightnessContrast).EffectParameters(1).Value = -0.35 'Brightness 
      .Shapes("GoogleMap1").Fill.PictureEffects.Insert(msoEffectBrightnessContrast).EffectParameters(2).Value = 0.75 'Contrast 

      .Shapes("GoogleMap2").Fill.PictureEffects.Insert(msoEffectSaturation).EffectParameters(1).Value = 0 'Saturation 
      .Shapes("GoogleMap2").Fill.PictureEffects.Insert(msoEffectBrightnessContrast).EffectParameters(2).Value = 0.35 'Contrast 
     End With 
     Set oWS = Nothing 
    Next i 
End Sub 

画像を約400ピクセルX 400ピクセル、ここで例Iのように画像をダウンロードする

Public Sub SwitchtoNight() 
    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 
    Application.EnableEvents = False 

    Dim oWS As Worksheet 
    For i = 5 To ThisWorkbook.Sheets.Count 
     Set oWS = ThisWorkbook.Sheets(i) 
     oWS.DisplayPageBreaks = False 
     With oWS 
      .Shapes("GoogleMap1").Fill.PictureEffects.Insert(msoEffectSaturation).EffectParameters(1).Value = 0: .Shapes("GoogleMap1").Fill.PictureEffects.Insert(msoEffectBrightnessContrast).EffectParameters(1).Value = -0.35: .Shapes("GoogleMap1").Fill.PictureEffects.Insert(msoEffectBrightnessContrast).EffectParameters(2).Value = 0.75 
      .Shapes("GoogleMap2").Fill.PictureEffects.Insert(msoEffectSaturation).EffectParameters(1).Value = 0: .Shapes("GoogleMap2").Fill.PictureEffects.Insert(msoEffectBrightnessContrast).EffectParameters(2).Value = 0.35 
     End With 
     Set oWS = Nothing 
    Next I 

    Application.EnableEvents = True 
    Application.Calculation = xlCalculationAutomatic 
    Application.ScreenUpdating = True 
End Sub 
+0

(MBまたは解像度)画像がどのくらいありますか?あなたはサンプル画像へのリンクを投稿できますか? (それが問題なら実際のサイトである必要はありません)コード全体ですか? (または、偶然、Excelやその他のアプリケーションをプログラムで開く/閉じる/操作するのですか?) – ashleedawg

+0

サンプルイメージを追加しました。322イメージのブック全体が20MBにすぎないため、大きなイメージはありません。画像は400 x 400 –

+0

私はまた、どのプログラムも操作していません。 Excelシートは新しく開かれ、このコードを実行する前に70MBのRAMしか使用していません。 –

答えて

2

ラムを使い果たす前に、私はシート140に取得するには、次のコードで enter image description here

がありますPNGの代わりにJPGとして保存するように、ナイトマップが役立ちます。私はExcelがちょうどこのスケールの画像操作を処理することを意図していないと思うが、保存、閉鎖&プロセスを途中で再開するとメモリが解放される。

ImBatchまたはBatchPhotoのように、このようなバッチ写真編集のためのいくつかの無料オプション(オンラインまたはダウンロード可能)があり、時間の無駄を省きます。

PictureEffectsは基本的に、各操作で新しい「レイヤー」を保存し、それに伴ってメモリを吸い上げることに注意してください。 (私の場合は、変更あたり約2000kbです。)

Excelを使用する場合はPictureEffects Objectの代わりにShapeRange.PictureFormat Propertyを使用します。あなたがAPIを使用している場合


はまた、スタックオーバーフローがタグあなたのためだけのを持っていることに注意してください! あなたの質問にそのタグを追加すると、そのAPIに慣れている人たちからの助けを得ることができます。

このリンク(URLで直接処理できるよりも調整に注意してください)チェックアウト:何かを試してみてください

http://maps.googleapis.com/maps/api/staticmap?key=AIzaSyADV4Wfi9-4ET5GG52Cw_l0_Bkt8W5vwvM&center=43.597586,-79.746689&zoom=14&markers=icon:http://www.xmeasures.com/images/planMapPin.png|43.597586,-79.746689&format=png32&sensor=false&size=480x480&scale=4&markers=color:black|&maptype=roadmap&style=feature|element:geometry|hue:0xwhite|saturation:-100%|lightness:100|visibility:off&style=feature:road|element:geometry|hue:0xblack|saturation:-100%|lightness:-20|visibility:on&style=feature:road.path|element:labels|hue:0xblack|saturation:-100%|lightness:-20|visibility:off&style=feature:labels|element:geometry|hue:0xblack|saturation:-100%|lightness:-20|visibility:off&style=feature:water|element:geometry|hue:0xblack|saturation:-100%|lightness:-40|visibility:on&style=element:labels.text.stroke|visibility:off&style=element:labels.text.fill|visibility:off&style=feature:road|hue:0xblack|saturation:-100%|lightness:-100|element:labels.text.fill|visibility:on&style=feature:transit|visibility:off&style=feature:poi|visibility:off&style=feature:landscape|visibility:off&key=AIzaSyADV4Wfi9-4ET5GG52Cw_l0_Bkt8W5vwvM| Source


をlike:

Dim oWS As Worksheet, sh As Shape 

...

Set oWS = ThisWorkbook.Sheets(I) 
    Set sh = oWS.Shapes("GoogleMap1") 
    With sh 
     .PictureFormat.Brightness = -0.35 
     .PictureFormat.Contrast = 0.75 

     With sh.Fill.PictureEffects 
      .Delete (1) 
      .Insert(msoEffectSaturation).EffectParameters(1).Value = 0 
     End With 
    End With 
    Set sh = Nothing 
    Set oWS = Nothing 

...

私はこれをテストしていないが、例があるherehere

+0

静的マップapi呼び出しをうまく動かしたGoogleマップデザイナーから調整できましたが、画像を変更するShapeRange.PictureFormatプロパティを取得できませんでした –

+1

私は自分の答えに追加しました上記。 – ashleedawg

+1

夜景マップにアウトラインがないのでpicture.formatが使用されました:/ Picture.Formatは、ベースラインからのメモリ使用量をほとんど増加させないため、正しい方法です:) –

関連する問題