Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


177 / 3841 ページ ←次へ | 前へ→

【78930】Re:ExcelグラフをWordに貼り付けるマクロ...
発言  γ  - 17/3/5(日) 13:19 -

引用なし
パスワード
   解決したようで何よりです。

ただし、単純にグラフの大きさが原因とも思えません。
拡張メタファイルであれば、大きさは調整されて貼り付けられるはずです。
横幅が長いもので実験してもエラーにはなりません。
なにか別の原因、もしくは複合した要因で発生している気がします。

閲覧者が誤解してはいけないと思いコメントしたまでで、
原因追及を求めるものではありません。
ではこの辺で。
・ツリー全体表示

【78929】Re:ExcelグラフをWordに貼り付けるマクロ...
お礼  kiho  - 17/3/5(日) 10:02 -

引用なし
パスワード
   γさん
早速のアドバイス、ありがとうございます。

“Word側の処理が追いつかない”という、自分では
ちょっと思い付かないことでした。

 ご提示のあった、
>・DoEventsを入れる。(複数回繰り返してもよい)
>・ExcelのApplication.Wait メソッド
>・APIのSleep
 を試してみましたが、今回は、これが原因では
なかったようです。

 更にあれこれ自分で考えて対処してみたなかで、
貼り付けるグラフ図のサイズを小さくしてみたところ、
正常に処理できました。(うれしかった〜)

 グラフ図のサイズがWord文書の貼り付け位置の
横幅より少々大きかったようで、数枚の貼り付け
処理ができていたので、グラフ図自体には問題ない
と思っていたのがいけなかったと思います。

 発想の転換が必要ですね。これも、今回、γさん
からのアドバイスの影響だと思いました。

 本当に、どうもありがとうございました。
・ツリー全体表示

【78928】Re:ExcelグラフをWordに貼り付けるマクロ...
発言  γ  - 17/3/5(日) 6:58 -

引用なし
パスワード
   Word側の処理が追いつかないということなんでしょうか。
ループのなかで適当な遊びを設けてみてはどうですか?
・DoEventsを入れる。(複数回繰り返してもよい)
・ExcelのApplication.Wait メソッド
・APIのSleep
などいくつか手はあるでしょう。
・ツリー全体表示

【78927】ExcelグラフをWordに貼り付けるマクロに...
質問  kiho  - 17/3/4(土) 23:33 -

引用なし
パスワード
   初めて投稿させていただきます。よろしくお願いいたします。

ネットの情報を見ながら、Excelのシート上の複数のグラフを
Word文書に貼り付けるVBAを作成していますが、エラーとなって
しまい、困っています。自分なりに調べ、あれこれやってみたの
ですが、うまく行きません。アドバイスをいただけないでしょうか。

処理内容は下記のリストの通りなのですが、概要は以下の通りです。
 1)Word.Application の参照を設定
 2)新しいWord文書を追加・表示
 3)対象とするExcelファイルの数(fCount)と名称(fName(i))を取得
  (他のサブルーチン GetFilesName で行っていて、上記2つの
   変数はグローバルなものとしています。)
 4)ファイル数 fCount(現在は1つ)のループの中で、そのファイル
  を絶対パス(stdDir & fName(i))でオープン
 5)シート数(sCount)を取得(現在7つ)して、その数分、以下を実施
 6)シート名を取得して、そのシート上のグラフ数(nfig)を取得、
  そのグラフ数分、以下を実施
 7)各グラフを選択し、クリップボードにコピーした後、Word文書に
  ペースト
 8)上記をループ処理した後に、後処理して終了

上記の処理で、シート1枚目(j=1の時)にはグラフは無い為、何も処理
しません。シート2枚目(j=2のとき)には、グラフが14枚(nfig=14)
あるのですが、その内、5枚だけ描いて、6枚目で以下のエラーと
なってしまうのです。
---
 実行時エラー'4198:
 コマンドは正常終了できませんでした。
---

エラーは、Word文書へペーストする“.Selection.PasteSpecial…”
の所でですが、グラフを5枚描く処理も、6枚目を描く処理も変わらない
のに、何故エラーとなるのか、わからない状況です。

---
<リスト>
Sub WrdCreate_main()

  Dim nWord As Object
  Dim nWordDoc As Object
  Dim nfig As Long

  Set nWord = CreateObject("Word.Application") '「Word.Application」オブジェクトへの参照

  With nWord
    Set nWordDoc = .Documents.Add '新しいWord文書を追加、表示
    .Visible = True
  End With

  Call GetFilesName         '対象Excelファイルのファイル数:fCount と
                   'その各ファイル名:fName(i) を取得してくる
  For i = 1 To fCount
    Set wb = Workbooks.Open(strDir & fName(i)) '対象Excelファイルを順次オープン

    sCount = wb.Sheets.Count          'シート数の取得
    ReDim sName(1 To sCount)

    For j = 1 To sCount
      sName(j) = wb.Sheets(j).Name      'シート名の取得
      nfig = wb.Sheets(j).ChartObjects.Count 'シート毎のグラフ数の取得

      For k = 1 To nfig
        Sheets(sName(j)).ChartObjects(k).Select
        Worksheets(sName(j)).ChartObjects(k).Copy 'シート上のグラフ1枚をクリップボードへ

        With nWord 'クリップボード上の内容をWord文書へ
          .Selection.PasteSpecial Placement:=wdInLine, DataType:=wdPasteMetafilePicture
          .Selection.ParagraphFormat.Alignment = wdAlignParagraphLeft
        End With

      Next k
    Next j
  Next i

  Set nWord = Nothing
  Set nWordDoc = Nothing

End Sub

---ここまで

 原因を調べる為のヒントでも結構ですので、何卒、よろしくお願いいたします。
・ツリー全体表示

【78926】Re:Solverを使うのが正しいのでしょうか?
お礼  M.E  - 17/2/28(火) 19:51 -

引用なし
パスワード
   >マクロ記録してみれば、コードが得られますよ。

マクロ記録か、そうですね。
まず、やってみます。
分からなかったら、また、質問させてください。

早速の書き込み、
ありがとうございました。

M.E
・ツリー全体表示

【78925】Re:フォルダ内の画像抽出について
お礼  vba勉強中  - 17/2/28(火) 14:03 -

引用なし
パスワード
   ▼β さん:
ありがとうございます!
dir関数でもワイルドカードの使用はできました!もっと試してから書き込むべきだったかもしれません…
なのですが、
fname = Dir(fpath & "*テスト*")
これで[〜テスト〜]については見つけてくれることはわかったのですが、"*テスト*"が変数なので、画像名を参照セルより確定させてから
fname=画像名
fname=Dir(fpath & "*fname*")
ではできない、と思っていましたがこれだとそのままfnameを含む画像を探すことになりますね


fname = Dir(fpath & "*" & fname & "*")
として解決できました!!
いつもありがとうございます!
・ツリー全体表示

【78924】Re:フォルダ内の画像抽出について
発言  β  - 17/2/28(火) 11:37 -

引用なし
パスワード
   ▼vba勉強中 さん:

>dir関数ではワイルドカードは使用できないとの話をどこかで見た

そんなことはないですよ。

たとえば AAA-BBB.jpg というものをDIR関数に与えると、そのものずばりのファイル名指定になりますけど

*AAA-BBB.jpg とすると なんとか が AAA の頭についたものもピックアップしますし
*AAA*-BBB.jpg とすると AAA の前後に何かがついているものもピックアップします。

BBB の部分も同様です。

AAA と BBB のいずれをワイルドカードにしたいのか、あるいは両方ワイルドカードにしたいのか
なんとかAAA なのか、AAAなんとか なのか なんとかAAAなんとか なのか、そこは
そちらの要件次第で。

これをもとに頑張ってみませんか?
・ツリー全体表示

【78923】フォルダ内の画像抽出について
質問  vba勉強中  - 17/2/28(火) 11:04 -

引用なし
パスワード
   以前画像貼り付けについて質問させていただいたものです。
その節はβさん、ありがとうございました。

任意のフォルダの中の画像を取り出したいのですが、画像の名前が部分一致でも抽出できるようにしたいです。
いままでは完全一致のものを取り出していたのですがその時は、dir関数を使っていました。(それもここでの教えですが)
dir関数ではワイルドカードは使用できないとの話をどこかで見たので調べていたところ、filesystemobjectの方が使い勝手が良い、とこれまたどこかのサイトで見かけました。しかしながらFolderExistsメソッドでもワイルドカードの対応はしていないようでした。ので行き詰まり助けを求めている状態です。

現状functionマクロから一度画像の名前を全部取得してから、部分一致があればそれを検索する名前に変更して、また、完全一致の画像を探す。といった風になりそうです。

だいぶ回りくどい気がするのですが、知恵をお貸しいただければと思います。
相変わらずの知識不足、説明下手で申し訳ないのですがよろしくお願いいたします。
・ツリー全体表示

【78922】Re:Solverを使うのが正しいのでしょうか?
発言  γ  - 17/2/28(火) 7:44 -

引用なし
パスワード
   まずは実行してみてはどうですか?
セルにそのユーザー定義関数を使った式を入れます。
マクロ記録してみれば、コードが得られますよ。

・マクロ実行にはSolverの「参照設定」が必要です。
・複数の解があり得るので、初期値の設定に注意が必要でしょう。
・ツリー全体表示

【78921】Solverを使うのが正しいのでしょうか?
質問  M.E  - 17/2/28(火) 2:48 -

引用なし
パスワード
   お世話になります。

例えば、
1)Function X(a,b,c as single)とします。
2)Y =aX^3(aXの3乗)-bX^2-cX+5という関数のY=0にするXを求めたい

これは、「Solver」という機能を使えばよろしいのでしょうか?
Solverを使うとするのであれば、どのように記述すればよろしいのでしょうか?
(MaxMinVal:=3, ValueOf:="0" だと思うのですが、他が全然わからず・・・)

ご教示いただければ幸いに存じます。

よろしくお願い申し上げます。

M.E
・ツリー全体表示

【78920】Re:ファイルを更新順に読み込む方法
お礼  もりC  - 17/2/23(木) 17:49 -

引用なし
パスワード
   ▼β さん:


これです!思惑通りです。
サンプルコードを分析し、活用させていただきます。
大量のデータを処理するので、助かりました。
こんなにすっきりしたコードでできるのですね。素晴らしすぎます。

EXCELのマクロですので、一旦ファイル名とタイムスタンプを適当なセルに
書き出し、タイムスタンプとファイル名にソートを掛け、
上から順番に実行するという恥ずかしいプログラムを書くところでした。

ちなみに、abjA.MoveFirst で止まったときに使用したEXCELバージョンは
2010です。

お礼が遅くなりもうしわけありません。
βさんありがとうございました。

ウッシさんもありがとうございました。
こんごともよろしくお願いします。


>▼もりC さん:
>
>>objA.MoveFirstのところでコンパイルエラーが発生します。
>
>こちらではコンパイルエラーはでませんが?
>エクセルのバージョンは?
>
>それはそれとして、別案。
>フォルダ内のcsvファイルを最新更新日順に取り出すサンプルコードです。
>
>Sub Test()
>  Dim fPath As String
>  Dim fName As String
>  Dim sl As Object
>  Dim k As String
>  Dim i As Long
>  
>  Set sl = CreateObject("System.Collections.SortedList")
>  fPath = ThisWorkbook.Path & "\"
>  
>  fName = Dir(fPath & "*.csv")
>  
>  Do While fName <> ""
>    k = Format(FileDateTime(fPath & fName), "yyyymmddhhnnss") & " " & fName
>    sl.Add k, fPath & fName
>    fName = Dir()
>  Loop
>  
>  For i = 0 To sl.Count - 1
>    MsgBox sl.getbyindex(i)
>  Next
>  
>End Sub
・ツリー全体表示

【78919】Re:アプリケーション起動完了の判定
お礼  ちょろすけ  - 17/2/23(木) 9:23 -

引用なし
パスワード
   γさん

もう少し検討を依頼してみます。
アドバイスありがとうございました。

▼γ さん:
>Runメソッドでは、制御が行ったきりになるので、
>この場合は適切ではなかったですかね。
>どんな操作を想定しているか不明ですが、
>Send keyの不安定さを考えると、
>早晩、壁にぶつかるはずです。
>アプリを管理しているところにニーズを伝えて、
>検討を求めるのが、有効なアプローチでしょう。
・ツリー全体表示

【78918】Re:For-Next
お礼  トキノハジメ  - 17/2/23(木) 8:53 -

引用なし
パスワード
   ▼β さん:
色々ありがとうございます。

今後とも宜しくお願い致します。
・ツリー全体表示

【78917】Re:アプリケーション起動完了の判定
発言  γ  - 17/2/23(木) 8:29 -

引用なし
パスワード
   Runメソッドでは、制御が行ったきりになるので、
この場合は適切ではなかったですかね。
どんな操作を想定しているか不明ですが、
Send keyの不安定さを考えると、
早晩、壁にぶつかるはずです。
アプリを管理しているところにニーズを伝えて、
検討を求めるのが、有効なアプローチでしょう。
・ツリー全体表示

【78916】Re:アプリケーション起動完了の判定
質問  ちょろすけ  - 17/2/23(木) 8:27 -

引用なし
パスワード
   γさん
返信ありがとうございます。

会社の複数人が使うので、環境や状況によってGomPlayerの起動時間が違ってくると思います、
そこで誰が使ってもGomPlayerの起動完了後にnotepadが開く様にしたかったのです。

となると簡単なコードでは難しいのでしょうか?
宜しくお願い致します。

▼γ さん:
>先にβさんのフォローに御礼申し上げます。
>
>>第3引数にTrueを指定しているので、GomPlayerを閉じないと
>>notepadが開かないのは正解なのですね。
>
>そう思います。
>
>>notepadを連続で起動するのは何か方法がありますでしょうか?
>
>先に非同期でnotepadを立ち上げておくんでしょうか?
>
>単に時間差を設けるなら、Sleep(APIでの)とかを使って、
>予め処理を待っておく方法なども考えられるかも知れません。
>どの程度、起動終了後に直ちに後続処理を行う必然性があるかに
>依存するでしょうね。
>すでに提案があった方法を否定しているわけではありませんので、
>誤解なきよう。
・ツリー全体表示

【78915】Re:アプリケーション起動完了の判定
発言  γ  - 17/2/22(水) 23:35 -

引用なし
パスワード
   先にβさんのフォローに御礼申し上げます。

>第3引数にTrueを指定しているので、GomPlayerを閉じないと
>notepadが開かないのは正解なのですね。

そう思います。

>notepadを連続で起動するのは何か方法がありますでしょうか?

先に非同期でnotepadを立ち上げておくんでしょうか?

単に時間差を設けるなら、Sleep(APIでの)とかを使って、
予め処理を待っておく方法なども考えられるかも知れません。
どの程度、起動終了後に直ちに後続処理を行う必然性があるかに
依存するでしょうね。
すでに提案があった方法を否定しているわけではありませんので、
誤解なきよう。
・ツリー全体表示

【78914】Re:For-Next
発言  β  - 17/2/22(水) 21:29 -

引用なし
パスワード
   ▼トキノハジメ さん:

For/Next を 2例と、別案1例。

Sub Sample1()
  Dim j As Long
  
  For j = 4 To 21
    Cells(9, j).Value = Cells(7, j).Value - Cells(8, j).Value
  Next
  
End Sub

Sub Sample2()
  Dim j As Long
  
  For j = 0 To 17
    Range("D9").Offset(, j).Value = Range("D7").Offset(, j).Value - Range("D8").Offset(, j).Value
  Next
  
End Sub

Sub Sample3()
  Range("D9:U9").Formula = "=D7-D8"
  Range("D9:U9").Value = Range("D9:U9").Value
End Sub
・ツリー全体表示

【78912】For-Next
質問  トキノハジメ  - 17/2/22(水) 20:28 -

引用なし
パスワード
   いつもお世話になります。

下記のコードを For-Next にするどうすれはよいかおしえてください。

宜しくお願い致します。 

  Range("D9").Value = Range("D7").Value - Range("D8").Value
  Range("E9").Value = Range("E7").Value - Range("E8").Value
  Range("F9").Value = Range("F7").Value - Range("F8").Value
  Range("G9").Value = Range("G7").Value - Range("G8").Value
  Range("H9").Value = Range("H7").Value - Range("H8").Value
  Range("I9").Value = Range("I7").Value - Range("I8").Value
  Range("J9").Value = Range("J7").Value - Range("J8").Value
  Range("K9").Value = Range("K7").Value - Range("K8").Value
  Range("L9").Value = Range("L7").Value - Range("L8").Value
  Range("M9").Value = Range("M7").Value - Range("M8").Value
  Range("N9").Value = Range("N7").Value - Range("N8").Value
  Range("O9").Value = Range("O7").Value - Range("O8").Value
  Range("P9").Value = Range("P7").Value - Range("P8").Value
  Range("Q9").Value = Range("Q7").Value - Range("Q8").Value
  Range("R9").Value = Range("R7").Value - Range("R8").Value
  Range("S9").Value = Range("S7").Value - Range("S8").Value
  Range("T9").Value = Range("T7").Value - Range("T8").Value
  Range("U9").Value = Range("U7").Value - Range("U8").Value
・ツリー全体表示

【78911】Re:アプリケーション起動完了の判定
質問  ちょろすけ  - 17/2/22(水) 11:06 -

引用なし
パスワード
   γさん

すいません勘違いをしてました。
第3引数にTrueを指定しているので、GomPlayerを閉じないとnotepadが開かないのは正解なのですね。

という事は、自分が期待しているGomPlayerが起動完了後(ウインドウが完全に開いたのを確認後)に、notepadを連続で起動するのは何か方法がありますでしょうか?

宜しくお願い致します。

▼ちょろすけ さん:
>γさん
>早速アドバイスいただいたRunメソッドを試してみたく、以下のコードを実行しました。
>
>Sub Sample()
>  With CreateObject("Wscript.Shell")
>    .Run """C:\Program Files\GRETECH\GomPlayer\GOM.EXE""", 3, True
>    .Run "C:\Windows\system32\notepad.exe", 3, True
>  End With
>End Sub
>
>非常にシンプルで良いですね!
>ただ、自分が期待していたのはGomPlayerが起動完了後に、notepadが連続で起動すると
>思っていたのですが、GomPlayerを閉じないとnotepadが開かないのです。
>また、GomPlayer起動後に最大化ウインドウになりませんでした。
>(notepadは最大化ウインドウになりました。)
>
>何が原因かご教示いただけないでしょうか。
>宜しくお願い致します。
>
>▼γ さん:
>>すでに解決ずみかもしれませんが、別の方法として、
>>WSHのWshShellクラスのインスタンスを作成し、
>>Runメソッドを使う方法はいかがでしょうか。
>>
>>ht tps://www.moug.net/tech/exvba/0100034.html
>>の後半部分を参考にして下さい。
>>
>>なお、どんなアプリケーションなのか提示すると
>>別の方法が提示されるかもしれません。
>>IEとかでしたら、待つ方法は色々あるようです。
>>Sendkeysはできれば避けたい方法ですよね。
>>その辺も含めてコメントが寄せられるかもしれません。
>>現在の情報だけだと不足かもしれませんよ。
・ツリー全体表示

【78910】Re:アプリケーション起動完了の判定
質問  ちょろすけ  - 17/2/22(水) 10:54 -

引用なし
パスワード
   γさん
早速アドバイスいただいたRunメソッドを試してみたく、以下のコードを実行しました。

Sub Sample()
  With CreateObject("Wscript.Shell")
    .Run """C:\Program Files\GRETECH\GomPlayer\GOM.EXE""", 3, True
    .Run "C:\Windows\system32\notepad.exe", 3, True
  End With
End Sub

非常にシンプルで良いですね!
ただ、自分が期待していたのはGomPlayerが起動完了後に、notepadが連続で起動すると
思っていたのですが、GomPlayerを閉じないとnotepadが開かないのです。
また、GomPlayer起動後に最大化ウインドウになりませんでした。
(notepadは最大化ウインドウになりました。)

何が原因かご教示いただけないでしょうか。
宜しくお願い致します。

▼γ さん:
>すでに解決ずみかもしれませんが、別の方法として、
>WSHのWshShellクラスのインスタンスを作成し、
>Runメソッドを使う方法はいかがでしょうか。
>
>ht tps://www.moug.net/tech/exvba/0100034.html
>の後半部分を参考にして下さい。
>
>なお、どんなアプリケーションなのか提示すると
>別の方法が提示されるかもしれません。
>IEとかでしたら、待つ方法は色々あるようです。
>Sendkeysはできれば避けたい方法ですよね。
>その辺も含めてコメントが寄せられるかもしれません。
>現在の情報だけだと不足かもしれませんよ。
・ツリー全体表示

177 / 3841 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free