Excel VBA質問箱 IV

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

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


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

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

【78271】Re:飛び飛びのセルに一次元配列を配列で...
質問  himuro  - 16/6/15(水) 16:27 -

引用なし
パスワード
   ▼β さん:
>▼himuro さん:
>
>もう1つ申し上げておきます。
>転記元がどうなっているのかにもよりますが、効率アップは、転記時の話です。
>
>転記元セル領域 --> いったん配列に納めて --> 転記先セル領域に書き込み
>
>これでは、かえって(微々たるものですが)処理時間が増えます。
>こういう場合なら 転記元セル領域から転記先セル領域に書きこむべきですよ。

なるほど、具体的にはこのような感じになります。

'wordは可変。1つだったり20個だったりする。
dim word: word = "a, b, c, d, e, f, g, h, i, j, k, l, m, n, o"

dim arr1: arr1 = split(word, ",")

dim i, max: max = UBound(arr1)

dim a as range

'alphaはrange("A1:A10, C1:C10, E1:E10")の名前付きセル
for each a in alpha
a = arr1(i)
i = i + 1
if i > max then exit for
next a

このようなコードを、配列を使うことにより効率化できるでしょうか。
・ツリー全体表示

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

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

もう1つ申し上げておきます。
転記元がどうなっているのかにもよりますが、効率アップは、転記時の話です。

転記元セル領域 --> いったん配列に納めて --> 転記先セル領域に書き込み

これでは、かえって(微々たるものですが)処理時間が増えます。
こういう場合なら 転記元セル領域から転記先セル領域に書きこむべきですよ。
・ツリー全体表示

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

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

確かにセル範囲への値書き込みは セル毎に行うより、まとめて、どさっと書きこんだほうが
圧倒的に効率はよくなります。
(例に挙げられたのは サンプル というか考え方でしょうけど、これぐらいのセル数なら
 ほとんど変わりはありませんが)

ただし、とびとびの複数セル領域への一括書きこみは不可能です。
あくまで、1領域ごとの書き込みになります。

次に、具体的には、どこの値をそれぞれのセル範囲に転記したいのでしょうか。
それを(1つの例としてでもいいので)提示願えませんか。
そのほうが、より具体的な回答につながると思いますので。

お先走って申し上げると、値を格納する配列は、今回の場合、全体としては1次元配列、
その中の要素が、各領域に書きこむべき2次元配列になると思います。
・ツリー全体表示

【78268】Re:クリックしてセルの色を変える時
お礼  sea  - 16/6/15(水) 15:33 -

引用なし
パスワード
   ▼独覚 さん:
返信有り難うございます。

VBAの事は、全く理解しないまま試みていました。
一から勉強し直します。

ありがとうございました。
・ツリー全体表示

【78267】飛び飛びのセルに一次元配列を配列で代入...
質問  himuro  - 16/6/15(水) 14:13 -

引用なし
パスワード
   一次元配列の値を、飛び飛びのセル範囲に配列を使って代入する方法を教えて下さい。

飛び飛びのセル範囲は、alphaという名前付きセルで、A1:A5, C1:C5, E1:E5を参照している事にします。

一次元配列の値が"a, b, c, d, e, f, g..."だとすると、
A1からA5にはa~eが、C1~C5にはf~j, E1~E5にはk~oが入る感じです。

for eachで飛び飛びのセル範囲を一つずつ走査して代入する事はできましたが、やはり速度が気になるので配列を使って処理したいです。

2次元配列を作り、その配列に最初の一次元配列の値を格納して、
最後にalphaに代入する感じでしょうか。

しかし具体的なコードの書き方がいまいち分かりません。
よろしくお願いします。
・ツリー全体表示

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