Excel VBA質問箱 IV

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

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


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

【78294】Re:グラフを右クリック時のメニュー追加
お礼  North  - 16/6/17(金) 14:45 -

引用なし
パスワード
   kamikayaさん
ご回答ありがとうございます。本当に助かります。
提示いただいたコードを参考にやってみます。
また不明点など出てきたら質問させていただきます。
・ツリー全体表示

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

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

先ほども言ったように,グラフの既存の右クリックメニューへの追加はできませんが,以下のように独自の右クリックメニューを作成することはできます。

下記のコードをそれぞれのモジュールにコピーして,プロシージャ"実行するマクロ"を実行してみてください。

グラフ上で[Shift]キーを押しながら右クリックを押すことで独自右クリックメニュー(Test)がポップアップするようになっています。

※これでは各ブックで行わなくてはならないので,実装するならアドインファイルとした方が良いかと思います。

【Microsoft Excel Objects ThisWorkbook】

Private WithEvents xApp As Application

【標準モジュール】

Option Explicit

Public MyMenu
Private ChrtEvents As New Collection

'■はじめに起動する場所
Sub 実行するマクロ()

  '独自右クリックメニューの作成
  subSettingMyMenu

  '独自右クリックメニューのグラフへの割り当て
  Dim CH As ChartObject
  Dim WS As Worksheet
  
  'アクティブブック上のすべてのグラフに独自右クリックメニューを割り当てる
  For Each WS In ActiveWorkbook.Worksheets
    For Each CH In WS.ChartObjects
      Dim ChartEvent As New Class1 '"Class1"の箇所はクラスモジュールの名前と揃える
      Set ChartEvent.xChart = CH.Chart
      ChrtEvents.Add ChartEvent
    Next
  Next

End Sub

'■独自右クリックメニューの作成
Private Sub subSettingMyMenu()

  Set MyMenu = Application.CommandBars.Add(Position:=msoBarPopup, Temporary:=True)
  With MyMenu
    With .Controls.Add
      .Caption = "Test"     'そちらの"調整"に相当
      .OnAction = "subTest"   'そちらの"mAdj"に相当
    End With
  End With
  
End Sub

'■最終的に実行したいマクロ

Private Sub subTest()

  MsgBox "Hello world"

End Sub

【クラスモジュール(Class1)】

Option Explicit

Public WithEvents xChart As Chart
Dim Flag As Boolean

'■グラフ上でマウスボタンが押されたら…
Private Sub xChart_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal Y As Long)

  If Button = 2 Then
    If Shift = 1 Then
      MyMenu.ShowPopup
    End If
  End If
  Flag = True

End Sub

'■グラフが右クリックされたら…
Private Sub xWorksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

  If Flag = True Then
    Cancel = True
    Flag = False
  End If

End Sub
・ツリー全体表示

【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
・ツリー全体表示

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