Excel VBA質問箱 IV

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

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


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

【78292】Re:指定フォルダオープンを自ブック所在...
お礼  KEN  - 16/6/17(金) 13:26 -

引用なし
パスワード
   βさん。
できました!
どうもありがとうございました!!
・ツリー全体表示

【78291】Re:指定フォルダオープンを自ブック所在...
発言  β  - 16/6/17(金) 11:53 -

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

単純に、Shell(文字列,vbNormalFocus) この文字列についてみますと

"explorer.exe C:\TEST\abc"

これは

explorer.exe●C:\TEST\abc

ですね(●は半角スペース)

一方、

"explorer.exe & ""ThisWorkbook.Path " & " \abc\"""

これは

explorer.exe●&●"c:\hoge\hogehoge\hogehogehoge●●\abc\"

こうなってしまいますね。

定数である C:\TEST\abc を 変数と定数の連結にするわけですから

Shell("explorer.exe " & ThisWorkbook.PAth & "\abc", vbNormalFocus)

ではないでしょうか?
・ツリー全体表示

【78290】Re:マクロのアプリケーション画面を自動...
発言  β  - 16/6/17(金) 11:40 -

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

昔、こんな話題を見かけた記憶もありますが、すっかり忘却の彼方です。仮に、

Sub Try()
  Application.SendKeys "%{F11}"
  DoEvents
  Application.SendKeys "%{F11}"
End Sub

こんなマクロを使って、VBE画面を一瞬表示させて、うまくいったとします。
(これだけではうまくいかないような気もしますが)
でも、本当の原因はどこかにあるわけで、このような小手先の対応をするのは
あまり感心しません。

また、どのマクロを実行してもエラーになるなら、このマクロ実行そのものもできないかも?

まず、問題を切り分ければいかがでしょう。

・そもそも、エラー とは、どういう状態なのか。
 実行時エラーになるのか、わけのわからないメッセージがでて実行が拒否されるのか
 あるいは、エクセルが固まるのか、さらにはエクセルが落ちてしまうのか。
 そのときに出されるエラー番号とメッセージでネット検索すると、なにか同じ状況の報告が
 あるかもしれません。

・エラーになるのは、特定のモジュールの特定のマクロ?
 それとも、特定のモジュールのマクロすべてか?
 あるいは、別モジュールも含めて、すべてのマクロか?


 特定のマクロということであれば、そのマクロそのものに問題がある公算大です。
 その場合はコードを見る必要があるでしょう。

 特定のモジュールのマクロすべてであれば、そのモジュールが何かおかしくなっているかもしれません。
 もしかしたら、先頭に記述された Option hogeといったものと、エクセル環境があわないのかもしれません。
 (考えにくいですが)
 あるいは、モジュールが破壊されている? であれば エクスポート付開放を行ったうえでインポートとか
 そのモジュールの記述内容をメモ帳あたりにコピーしておいて、モジュールを削除。新規モジュールを挿入して
 そこにメモ帳からコードを移植。
 
といったことを、地道に調べてみたらいかがでしょう。
・ツリー全体表示

【78289】指定フォルダオープンを自ブック所在のフ...
質問  KEN  - 16/6/17(金) 11:35 -

引用なし
パスワード
   VBA初心者です。
指定フォルダオープンをShell("explorer.exe で作成しています。

アドレスを直で入力すると、うまく動きます。
Shell("explorer.exe C:\TEST\abc", vbNormalFocus)

しかし、アドレス直ではなく、自ブック所在のフォルダにしたいです。
Shell("explorer.exe & ""ThisWorkbook.Path " & " \abc\""", vbNormalFocus)
ではうまく動きません。

どこがおかしいでしょうか。
また、そもそも自ブック所在の場合は、書き方が違いますでしょか。

よろしくお願いします。
・ツリー全体表示

【78288】Re:マクロのアプリケーション画面を自動...
発言  へいへい  - 16/6/17(金) 9:35 -

引用なし
パスワード
   自分で作ったマクロですが、起動させるとエラーが発生してしまいます。しかし、VBA画面を開いて閉じるという工程を行うと、問題なくマクロが起動するので、その工程を自動で行えれば、使用前に手動で行わないで済むということから質問いたしました。
・ツリー全体表示

【78287】Re:マクロのアプリケーション画面を自動...
発言  β  - 16/6/17(金) 9:31 -

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

マクロのアプリケーション画面とは VBE画面のことですか?
シートを表示している状態で、ALt/F11 をおすと VBE画面になります。
また そこで Alt/F11 をおすとシートに戻ります。
ただし、VBE画面は、直前に表示していたモジュールが表示されます。
必ずしも ああ マクロが書かれているモジュールではありませんが。

そもそも、何をしたいのでしょうか?
処理中に、VBE画面を表示して何になるのでしょう?

かつ、自動的で閉じるとは、一瞬表示して すぐに閉じるのですか?

処理中に【開発者】としてVBE画面を見たいなら、通常の方法で見ればいいのではないですか?
・ツリー全体表示

【78286】Re:マクロのアプリケーション画面を自動...
発言  β  - 16/6/17(金) 9:29 -

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

マクロのアプリケーション画面とは VBE画面のことですか?
シートを表示している状態で、ALt/F11 をおすと VBE画面になります。
また そこで Alt/F11 をおすとシートに戻ります。
ただし、VBE画面は、直前に表示していたモジュールが表示されます。
必ずしも ああ マクロが書かれているモジュールではありませんが。

そもそも、何をしたいのでしょうか?
処理中に、VBE画面を表示して何になるのでしょう?

かつ、自動的で閉じるとは、一瞬表示して すぐに閉じるのですか?

VBIDE関連のコード処理をすれば可能ですが、なんのためにやるのかが見えません。

処理中に【開発者】としてVBE画面を見たいなら、通常の方法で見ればいいのではないですか?
・ツリー全体表示

【78285】Re:グラフを右クリック時のメニュー追加
発言  kamikaya  - 16/6/17(金) 9:20 -

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

結論から言わせていただくと、グラフの右クリックメニューへの追加はできないようです。

私も以前挑戦しており、その際に多くのサイトを見てまわりましたがどなたも同じ結論でした。おそらくバグなのだと思います。

>グラフを右クリックした時のメニューを追加したいのですが
>
>  With Application.CommandBars("Shapes").Controls.Add()
>    .BeginGroup = True
>    .Caption = "調整"
>    .OnAction = "mAdj"
>  End With
>
>  With Application.CommandBars("Chart").Controls.Add()
>    .BeginGroup = True
>    .Caption = "調整"
>    .OnAction = "mAdj"
>  End With
>
>上記どちらもうまくいきません。
>アドバイスいただければ助かります。
>よろしくお願いします。
・ツリー全体表示

【78284】マクロのアプリケーション画面を自動で閉...
質問  へいへい  - 16/6/17(金) 9:12 -

引用なし
パスワード
   マクロのアプリケーション画面

Sub ああ()

ああ Macro

End Sub

この画面を自動で立ち上げて、自動で閉じる方法はありますか?

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

【78283】グラフを右クリック時のメニュー追加
質問  North  - 16/6/17(金) 9:07 -

引用なし
パスワード
   グラフを右クリックした時のメニューを追加したいのですが

  With Application.CommandBars("Shapes").Controls.Add()
    .BeginGroup = True
    .Caption = "調整"
    .OnAction = "mAdj"
  End With

  With Application.CommandBars("Chart").Controls.Add()
    .BeginGroup = True
    .Caption = "調整"
    .OnAction = "mAdj"
  End With

上記どちらもうまくいきません。
アドバイスいただければ助かります。
よろしくお願いします。
・ツリー全体表示

【78282】Re:飛び飛びのセルに一次元配列を配列で...
お礼  himuro  - 16/6/16(木) 3:20 -

引用なし
パスワード
   ▼亀マスター さん:
>横から失礼します。
>
>配列とは関係のない話なのですが、処理速度の向上を目指すなら、数式の再計算と画面更新を停止するだけでも効果があると思います。

返信有難うございます。
再計算ですが、ブックによっては常に手動の状態で運用しています。自動だと、関数で処理する時だけでなく、手動でセルの値を変更した時にも必ず重くなるのが痛いと感じます。worksheet_changeの先頭に手動再計算入れても、何も変わらないですよね。あれはつまり、再計算された後に呼ばれるイベントだと解釈しました。

なので、私は画面更新停止とイベントの停止をよく関数の頭に書く事が多いです。

worksheet_changeの中でif文をたくさん作り、個別に必要なcalculateを呼んでいます。

知らないことだらけなので、また是非アドバイスを下されば幸いです。
・ツリー全体表示

【78281】Re:飛び飛びのセルに一次元配列を配列で...
お礼  himuro  - 16/6/16(木) 3:05 -

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

仕事から帰ってきて返信が遅くなりました。

二つ提示して頂いたソースをじっくりデバッグしながら動かしてみました。
.areasプロパティを使ったことが無かったのと、配列の使い方がよく分かっていなかったので、このようなソースは思い浮かびませんでした。

一度にではないとはいえ、セル範囲毎に一気に書き込めるなら、もっと数が増えれば実に効率的な処理だと思いました。
とても勉強になります。

>コメントしたように、本当の必要性が判然としません。
>頭の中で考えたテーマのような気がします。

私が提示したソースは実際に書いて動かしてみたものと、処理方法は全く同じで、結果も意図した状態を再現できています。データ自体を簡単にしただけであって、回答者さんを混乱させる意図は全くなかった事は釈明しておきたいと思います。

その上で言葉を付け足すとすると、私がした事は、テキストボックスに入力した記号区切りのコード(実際はアルファベット一文字ではなく、英数字の文字列)を、表形式で一列おきに記号文字を取り除いてただそのまま転記した事です。転記したコードの横に文字を入力させるスペースを残しています。テキストボックスの元の値は、他にもそれを元に色んな用途で加工を施します。

今回、私の力では提示したソースのように、転記先の範囲セルをループして、一つ一つのセルを踏みながら代入する方法しか書けませんでした。
もっと精進したいと思います。

今回は迅速に回答して下さりどうも有難う御座いました。
・ツリー全体表示

【78280】Re:名称未定のテキストファイルの読込み方
発言  カリーニン  - 16/6/15(水) 22:48 -

引用なし
パスワード
   参考HPです。

ht tp://officetanaka.net/excel/vba/file/file08b.htm

FSOを使うのなら、テキストファイル読み込みもFSOを使えばいいのに、とは思います。
方法は↑でリンクした田中さんのHPに記載されています。
・ツリー全体表示

【78279】名称未定のテキストファイルの読込み方
質問  macmac  - 16/6/15(水) 22:05 -

引用なし
パスワード
   フルパス名が都度変更するテキストファイルを読込みしたいのですが
OPEN命令で、下記のようにしても読込みされませんでした。
(Open strFILENAME For Input As #fNoの行です。)
全くの素人のため原因がわかりません。
恐縮ですが、正しい方法を教えていただけないでしょうか。


Sub FileSearch(Path As String, Target As String)
  Dim FSO As Object, Folder As Variant, File As Variant
  Dim strFILENAME As Variant
  Dim info As String
  Dim s As String
  Dim a As String
  Dim fNo As Integer

  Set FSO = CreateObject("Scripting.FileSystemObject")
  For Each Folder In FSO.GetFolder(Path).SubFolders
    Call FileSearch(Folder.Path, Target)
  Next Folder
  For Each File In FSO.GetFolder(Path).Files
    If File.Name Like Target Then
    strFILENAME = File.Path

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
   fNo = FreeFile


   Open strFILENAME For Input As #fNo
   Close #fNo
・ツリー全体表示

【78278】Re:ブックAのマクロによってブックBでア...
お礼  kamikaya  - 16/6/15(水) 21:56 -

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

ご回答有り難うございます。

なるほど、2013からこのような仕様になっていたのですね。
自宅PCはExcel2010なので色々面倒なことになってしまいました…。

とりあえずはそちらの提案された方向でやってみようかと思います。
何か進展があったらここにその方法を書き込もうかと思います。

この度は有り難うございました。

>▼kamikaya さん:
>
>xl2013以降、エクセルが MDI から SDI に変わって、もっとも不都合に感じるのは
>ここですよね!!
>
>MSは、【念願の改訂を行った】といっているようですが迷惑千万。
>というか、SDI可はいいのですが、ユーザーフォームが どのブックがActiveの時に
>表示されようが、一番上の階層に表示する、そこを(これは SDIの思想からはずれますけど)
>特別に対応することを忘れたバグだと思っています。
>
>なので、当面の対策としては、おっしゃられるように、いったん UNLOAD して
>新しいブックで、あらためて SHOW。
>
>情報の継承は、継承すべき値を、UNLOAD前に、どこか(複数のブックから参照可能などこかのシート等)に書きこんでおいて
>Initialize で、そこに書き込みがあれば、各コントロールの値としてセット。
>
>こういう構えでしょうかね。
・ツリー全体表示

【78277】Re:飛び飛びのセルに一次元配列を配列で...
発言  亀マスター  - 16/6/15(水) 19:13 -

引用なし
パスワード
   横から失礼します。

配列とは関係のない話なのですが、処理速度の向上を目指すなら、数式の再計算と画面更新を停止するだけでも効果があると思います。
提示された条件のセル数はそう多くないので影響は小さいかもしれませんが、実務で使うものがもっとセル数が多かったり、計算式を多用しているのであれば、それなりに有効かと思います。

'再計算停止
Application.Calculation = xlCalculationManual
'画面更新停止
Application.ScreenUpdating = False

'実際の処理

'再計算開始
Application.Calculation = xlCalculationAutomatic
'画面更新開始
Application.ScreenUpdating = True
・ツリー全体表示

【78276】Re:ブックAのマクロによってブックBでア...
発言  β  - 16/6/15(水) 17:27 -

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

xl2013以降、エクセルが MDI から SDI に変わって、もっとも不都合に感じるのは
ここですよね!!

MSは、【念願の改訂を行った】といっているようですが迷惑千万。
というか、SDI可はいいのですが、ユーザーフォームが どのブックがActiveの時に
表示されようが、一番上の階層に表示する、そこを(これは SDIの思想からはずれますけど)
特別に対応することを忘れたバグだと思っています。

なので、当面の対策としては、おっしゃられるように、いったん UNLOAD して
新しいブックで、あらためて SHOW。

情報の継承は、継承すべき値を、UNLOAD前に、どこか(複数のブックから参照可能などこかのシート等)に書きこんでおいて
Initialize で、そこに書き込みがあれば、各コントロールの値としてセット。

こういう構えでしょうかね。
・ツリー全体表示

【78275】Re:飛び飛びのセルに一次元配列を配列で...
発言  β  - 16/6/15(水) 17:17 -

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

あるいは(ほとんど同じですが)

Sub Test2()
  Dim f As Variant
  Dim t As Variant
  Dim r As Range
  Dim i As Long
  Dim j As Long
  Dim x As Long
  Dim mx As Long
  
  '以下はあくまでテストデータ
  ReDim f(1 To 10)
  For x = 1 To UBound(f)
    f(x) = "data" & x
  Next
  
  'ここから処理
  x = 1
  mx = UBound(f)
  For Each r In Range("alpha").Areas
    'あくまで、領域の中の1かたまりごとの処理
    ReDim t(1 To r.Rows.Count, 1 To r.Columns.Count)
    For i = 1 To UBound(t, 1)
      For j = 1 To UBound(t, 2)
        'それぞれの領域のそれぞれのセルに何をいれたいのかがわからないので
        '適当な値を埋め込み
        If x <= mx Then
          t(i, j) = f(x)
        Else
          t(i, j) = Empty
        End If
        x = x + 1
      Next
    Next
    
    r.Value = t 'alpsha内の1つの領域にまとめて書きこみ
  
  Next
  
End Sub
・ツリー全体表示

【78274】Re:飛び飛びのセルに一次元配列を配列で...
発言  β  - 16/6/15(水) 17:08 -

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

コメントしたように、本当の必要性が判然としません。
頭の中で考えたテーマのような気がします。

いずれにしても、コメントしたように、とびとびの複数領域に一括して転記することは不可能。
やるなら、1つずつです。

こちらも頭の中で考えます。
f という1次元配列(要素数は不明)に格納された値を alpha 内の各セルに
配列経由で書きこみます。

Sub Test()
  Dim f As Variant
  Dim t As Variant
  Dim r As Range
  Dim i As Long
  Dim j As Long
  Dim x As Long
  
  '以下はあくまでテストデータ
  ReDim f(1 To 50)
  For x = 1 To UBound(f)
    f(x) = "data" & x
  Next
  
  'ここから処理
  ReDim Preserve f(1 To Range("alpha").Count)
  x = 1
  For Each r In Range("alpha").Areas
    'あくまで、領域の中の1かたまりごとの処理
    ReDim t(1 To r.Rows.Count, 1 To r.Columns.Count)
    For i = 1 To UBound(t, 1)
      For j = 1 To UBound(t, 2)
        'それぞれの領域のそれぞれのセルに何をいれたいのかがわからないので
        '適当な値を埋め込み
        t(i, j) = f(x)
        x = x + 1
      Next
    Next
    
    r.Value = t 'alpsha内の1つの領域にまとめて書きこみ
  
  Next
  
End Sub
・ツリー全体表示

【78272】ブックAのマクロによってブックBでアドイ...
質問  kamikaya  - 16/6/15(水) 16:45 -

引用なし
パスワード
   初投稿なので失礼があるかもしれませんが宜しくお願いいたします。

【開発環境】
Excel 2016

【目的】
 開かれているすべてのブックのシートの一覧リストが表示されるユーザーフォームを作成しています(アドインファイル)。最終的にはリスト上のシート名をクリックすると,そのシートに移動するようなものを作りたいと考えております。

【問題点】
 今,ブックAとブックBが開かれており,ブックA上でアドインファイルのユーザーフォームを起動します。ブックA内のシート間の移動は簡単なのですが,ブックBのシートに移動する際に問題があります。というのも,ブックB上の対象シートのアクティブは容易なのですが,ユーザーフォームはブックAで開かれているため,ブックBがアクティブになった時点でユーザーフォームが隠れてしまします。

【質問】
ブックAで起動したユーザーフォームをブックBに引継くないし,ブックBで再起動したいのですが,何か方法はありますでしょうか。
なおブックAおよびブックBには何もマクロは記述せず,すべてアドインファイルのモジュールに記述しなくてはなりません。

助言のほど宜しくお願いいたします。


現在のコードを簡単にすると以下のようになります。参考になれば幸いです。

アドインファイル
【標準モジュール】

  Sub Callback_QuickSheetAccess(Control As IRibbonControl)
    UserForm1.Show vbModeless
    'アドインファイルがインストールされた時点ですでに新規タブにリボンが作成されている。
  End Sub

【ユーザーフォーム】

  Private Sub UserForm_Initialize()
    dim ws, wb
    With Listbox1
      .Clear
      For Each wb In Workbooks
        .AddItem wb.Name    
        For Each ws In wb.WorkSheets
          .AddItem " " & ws.Name
          '1マス開けることでツリービューを再現しているつもり
        Next
      Next
    End With
  End Sub

  Private Sub Listbox1_Click()
    Dim Cnt, BookName, SheetName
    With Listbox1    
      'シート名以外がクリックされていた場合は終了
      If Left(.Value, 1) <> " " Then Exit Sub
     
      'ブック名の取得
      Cnt = .ListIndex
      Do While Left(.List(Cnt), 1) = " "
        Cnt = Cnt - 1
      Loop
      BookName = .List(Cnt)
      
      'シート名の取得(先頭の" "を除外するため次のようになる)
      SheetName = Right(.Value, Len(.Value) - 1)
      
      '移動
      Workbooks(BookName).Activate
      Workbooks(BookName).Worksheets(SheetName).Activate

      'このままでは移動はできるがユーザーフォームが別ブックに引き継げない…
      'Application.Run ブック名!プロシージャ名ではブックAからアドインファイルのマクロを呼ぶだけなので目的が果たせませんでした

    End With
  End Sub
・ツリー全体表示

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