Excel VBA質問箱 IV

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

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


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

【78935】Re:セル内の文字の一部の色を変えたい
お礼  M.E  - 17/3/6(月) 7:19 -

引用なし
パスワード
   早速のご返答、ありがとうございます。
恥ずかしながら、関数で書式が変えられないことを知りませんでした。
大変勉強になります。

β様のアドバイスやγ様のコードを基に、
試行錯誤してみようと思います。

途中、どうにも行き詰ってしまったら
また、投稿させてください。

今後とも、どうぞよろしくお願い申し上げます。

M.E
・ツリー全体表示

【78934】Re:セル内の文字の一部の色を変えたい
発言  γ  - 17/3/5(日) 22:00 -

引用なし
パスワード
   まずは、特定の文字の色を変更する動作を
「マクロ記録」してみてください。

それを元にして
繰り返し処理を考慮して、下記のようなコードを作ってみました。
部品として研究してみて下さい。

Sub test()
  Dim s As String
  Dim t As String
  Dim k As Long
  
  s = Range("A1").Value
  t = Range("B1").Value
  k = InStr(s, t)
  Do While k > 0
     Range("A1").Characters(Start:=k, Length:=Len(t)).Font.Color = RGB(255, 0, 0)
    k = InStr(k + Len(t), s, t)
  Loop
End Sub
・ツリー全体表示

【78933】Re:セル内の文字の一部の色を変えたい
発言  β  - 17/3/5(日) 21:26 -

引用なし
パスワード
   ▼M.E さん:

基本的なことですけど、通常数式であれユーザー定義関数(UDF)であれ

★書式の設定はできません。

したがって、M.Eさんの構想は、残念ながらNGとなります。

やるとすれば、UDFといったものではなく、たとえばシートのChangeイベントで
A1 ないしは B1 に値が入った時に、自動的に、この処理を実行するといったことが
考えられます。
・ツリー全体表示

【78932】Re:セル内の文字の一部の色を変えたい
発言  γ  - 17/3/5(日) 21:25 -

引用なし
パスワード
   ユーザー定義関数で書式を変更することはできません。
ボタンにマクロを登録して、Activecellにそういう変更を加えることは可能です。
そういうことでよいでしょうか?
・ツリー全体表示

【78931】セル内の文字の一部の色を変えたい
質問  M.E  - 17/3/5(日) 21:00 -

引用なし
パスワード
   いつもお世話になっております。
また、質問させてください。

例えば
A1に「AAABBBCCCAAABBBCCC」という文字が入っていたとします。
B1に「BC」という文字を入力したとします。
Functionプロシージャでユーザー関数を作成し
B1で指定した文字がA1に存在するとき
その部分(A1内のBCの部分(2箇所))を赤色に変えたい。

ヒントだけでも結構ですので、ご教示いただければ幸いに存じます。

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

M.E
・ツリー全体表示

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

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