Excel VBA質問箱 IV

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

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


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

【78613】Re:フォームコントロールボタン内容抽出(Excel)
発言  β  - 16/11/28(月) 18:47 -

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

>ファイル数・シート数も多いので機械的に調べる方法があれば
>教えて頂けるでしょうか?

フォームツールのボタンのみですが。
ブックの最後にシートを追加して列挙します。
どのモジュールなのかの情報はいれていませんが。
(いれるには面倒なことをしなければいけないので)

Sub Test()
  Dim cb As Button
  Dim shF As Worksheet
  Dim shT As Worksheet
  Dim pos As Range
  
  Set shT = Worksheets.Add(After:=Worksheets(Worksheets.Count))
  shT.Range("A1:C1").Value = Array("シート名", "ボタン名", "マクロ名")
  Set pos = shT.Range("A2")
  
  For Each shF In Worksheets
    For Each cb In shF.Buttons
      pos.Resize(, 3).Value = Array(shF.Name, cb.Name, cb.OnAction)
      Set pos = pos.Offset(1)
    Next
  Next
  
End Sub
・ツリー全体表示

【78612】Re:フォームコントロールボタン内容抽出(Excel)
発言  β  - 16/11/28(月) 18:38 -

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

まず、プロジェクトエクスプローラで、シートを選択してエクスポートされるのは
固有のActiveX処理コードではなく、それが書かれているシートモジュール全体です。
Private Sub CommandButton1_Click も『たまたま』そこに書かれているだけです。

フォームコントロールに登録されたマクロは、当該ボタンを右クリックしてマクロの登録を選ぶと
小さなダイアログボックスの上に、そのマクロ名が表示されています。
その横の 編集ボタンをおせば、そのマクロが書かれているモジュールが表示され
そのマクロの場所にカーソルがあります。

多くは標準モジュールに書かれていると思いますが、プロジェクトエクスプローラで
そのモジュールを選択してエクスポートすると、シートモジュールと同じく
ファイルとして出力されます。
標準モジュールの場合は、拡張子が bas になりますが。
・ツリー全体表示

【78611】重複文を避けたい go to XXX
質問  ふむふむ  - 16/11/28(月) 18:08 -

引用なし
パスワード
   皆様
お力をお貸し下さい。
以下が作成したモジュールです。

If文で、ある条件に応じて使用するシートを選択させて、コピー&ペイストさせるという形で命令文を書いています。
If文の最初の命令文の中でのある部分の動作が、次の条件の場合でも同じ動作のものがあるので、この部分を重複して書かずにすむ方法がないかと思っています。
確か、該当の位置を指示して(最初の位置は、AAA:などで表示し、終わりが解りません)、”go to AAA ”のように出来なかったでしょうか。

他にいい方法がありましら、ご教示いただけるとうれしいです。
宜しくお願いします。
 
****************************************************
Sub TESTEDM()

Dim flag As Boolean
Dim Fdir As String
Dim FPss As String
Dim FileName As String
Dim Opnbook As Workbook
Dim Z As Worksheet
Dim H As Worksheet

Dim sh1, sh5, Sh6, Sh7 As Worksheet
Dim 入力者 As String
Dim コメント As String
Dim メルアド As String
Dim 結果 As Long
Dim 確認 As Long
Dim 入力 As Long
Dim n As Integer


'チラついて五月蝿いのを防止
Application.ScreenUpdating = False

Fdir = "U:\マクロ作成中\"
FPss = Fdir & "リスト(てすと).xlsx"
FileName = FPss
flag = False


For Each Opnbook In Workbooks
If Opnbook.FullName = FileName Then
flag = True
Exit For
End If
Next Opnbook

If flag = False Then
Set Opnbook = Workbooks.Open(FileName)
End If

Set Z = Opnbook.Worksheets("入社_派遣社員")
Set H = Workbooks("管理表.xlsm.xlsm").Worksheets("追加職員データ入力")

Workbooks("管理表.xlsm.xlsm").Activate
Worksheets("追加職員データ入力").Select
If Range("C3").Value = "派遣" Then

Opnbook.Activate


  Sheets("入社_派遣社員").Select
  Range("A1").End(xlDown).Select
  MsgBox "最終行は" & Range("A9").End(xlDown).Row & "です。"
  結果 = MsgBox("入力行は" & Range("A9").End(xlDown).Row + 1 & "です。続けますか?", vbYesNo)
  If 結果 = vbYes Then
    n = Cells(Rows.Count, "A").End(xlUp).Row + 1
    Range("A" & n).Select
    ActiveWorkbook.Activate
    Sheets("入社_派遣社員").Select
AAA:
    Range("A" & n).Value = "ABC"
    入力者 = InputBox("Inpurt YOUR Name", "入力者", "")
    Range("B" & n).Value = 入力者
    Range("C" & n).Value = "不要"
    Range("I" & n).Value = H.Range("C4").Value
    Range("J" & n).Value = "22" & H.Range("C5").Value
    Range("K" & n).Value = H.Range("C6").Value
    Range("L" & n).Value = H.Range("C7").Value
    Range("M" & n).Value = H.Range("C8").Value
    Range("N" & n).Value = H.Range("C9").Value
    Range("O" & n).Value = H.Range("C10").Value
    Range("P" & n).Value = H.Range("C11").Value
    Range("Q" & n).Value = "日本"

    Userform1.Show   
'AAA、はここまでとしたい

    Range("U" & n).Value = H.Range("C14").Value
    Range("W" & n).Value = "JP02 NSC"
    Range("X" & n).Value = "E-External"
    Range("Y" & n).Value = "EC-Temp. (salaried)"
    Range("Z" & n).Value = H.Range("C15").Value
    コメント = InputBox("コメントがあれば、入力して下さい。", "コメント", "")
    Range("AA" & n).Value = コメント
  
   
    確認 = MsgBox("入力終了です。入力内容を確認しますか?", vbYesNo)
      If 確認 = vbYes Then
        Sheets("入社_派遣社員").Select
      Else
    
    '保存するか否かのダイアログ表示させたい。
        'Application.DisplayAlerts = False ←これは、表示なしVersion
    
        'Opnbook.Close
   
      Workbooks("管理表_.xlsm.xlsm").Activate
      H.Range("C3").Select
    
      MsgBox "次は、XXを作成して下さい。"
      End If
  Else
    MsgBox "必要項目に手入力して下さい。"
    n = Cells(Rows.Count, "A").End(xlUp).Row + 1
    Range("A" & n).Select
    

  End If

ElseIf Range("C3").Value = "インターンシップ" Then
  
  Opnbook.Activate
  Sheets("入社_インターン").Select
  Range("A1").End(xlDown).Select
  MsgBox "最終行は" & Range("A9").End(xlDown).Row & "です。"
  結果 = MsgBox("入力行は" & Range("A9").End(xlDown).Row + 1 & "です。続けますか?", vbYesNo)
  If 結果 = vbYes Then
    n = Cells(Rows.Count, "A").End(xlUp).Row + 1
    Range("A" & n).Select

    'Workbook ("管理表.xlsm")
    ActiveWorkbook.Activate
    Sheets("入社_インターン").Select
    
   ? GoTo AAA ?

 ’この後がわからない。。。  

End If

End Sub
・ツリー全体表示

【78610】フォームコントロールボタン内容抽出(Excel)
質問  でじ  - 16/11/28(月) 18:05 -

引用なし
パスワード
   Activexコントロールのボタンであれば、プロジェクトエクスプローラで
ボタンが配置されているシート選択し、右クリックの「ファイルのエクスポート」
により出力されるclsファイルに以下の様に書かれます。
Private Sub CommandButton1_Click()
Call macro名
End Sub

しかしフォームコントロールボタンの「マクロの登録」で設定された内容は
clsファイルにに出力されません。
会社で作成された数あるEXCELツールファイルのボタンに
何が設定されているのか把握したいのですが、
Activexボタンとフォームコントロールボタンが混在しています
ファイル数・シート数も多いので機械的に調べる方法があれば
教えて頂けるでしょうか?
・ツリー全体表示

【78609】Re:VLOOKUPを使いたい
お礼  もよもと  - 16/11/28(月) 15:29 -

引用なし
パスワード
   βさん:
ご丁寧にありがとうございます。
早速、トライしてみます。
・ツリー全体表示

【78608】Re:VLOOKUPを使いたい
発言  β  - 16/11/28(月) 12:51 -

引用なし
パスワード
   ▼もよもと さん:

γさんから

>>なお、そのつど全文引用するのはやめてください。
>>無駄に長くなります。 

というアドバイスがあるのに、それでも全文引用 ?

まぁ、それはさておき

>エラー値を表示せずに、メッセージ表示してTargetを消すような動作は
>できないでしょうか。

最初のApplication.VLookUp の結果を セル直接 ではなく Variant型の変数で受けます。

で、

If IsError(その変数) Then
  MsgBox "該当値がありません。" & vblf & "入力を元に戻します"
  Application.Undo
  Application.EnableEvents = True
  Exit Sub
Else
  その変数を目的のセルにセット
 2番目以降のVLookUp 等 現在のコード
End If

といったようにされるといいと思います。
ただ、一括複数入力時、ループ処理をされていますよね。
そうした場合、仮に、マッチする入力があって、そのあとにマッチしないものがあった場合は
UnDo で不具合が発生します。

ですから、ちょっとコード的には悩ましいところがありますね。
(手当て方法はありますが)

>MatchとIndexを組み合わせる方法がいまいちよく分からない

シート関数のMATCHの使い方はおわかりですよね。

Variant型変数 = Application.Match(・・・・)
If IsError(その変数) Then
  MsgBox "該当値がありません。" & vblf & "入力を元に戻します"
  Application.Undo
  Application.EnableEvents = True
  Exit Sub
Else
  3行目から200行目の領域の中の 変数が示す位置(変数+2 行目), の
  C,D,E列の値を目的のセルにセット
End If

こんな感じです。
ただし、一括複数入力時の課題は同じものがありますが。
・ツリー全体表示

【78607】Re:VLOOKUPを使いたい
お礼  もよもと  - 16/11/28(月) 10:10 -

引用なし
パスワード
   ▼γ さん:
>Application.WorksheetFunction.Lookup と On Error Go To を組み合わせても可能ですが、
>Application.Lookupとすると、エラーにならず、エラー値だけが返されます。
>これを利用するとよいでしょう。
>
>↓を参照してください。
>ht tps://www.moug.net/tech/exvba/0100035.html
>
>なお、この場合、なんどもVLOOKUPで検索するのは無駄になりますので、
>一度だけMatch関数で位置を調べ、
>あとはIndex関数を使うか、直接、行番号を使ってセルの値を取り出すのが
>効率的でしょう。
>
>なお、そのつど全文引用するのはやめてください。
>無駄に長くなります。 

γさん:
エラー値を表示せずに、メッセージ表示してTargetを消すような動作は
できないでしょうか。
また、MatchとIndexを組み合わせる方法がいまいちよく分からないので
併せて教えて頂けると幸いです。
・ツリー全体表示

【78606】Re:TextBoxになるべく大きく文字を書くに...
回答  りった  - 16/11/28(月) 9:58 -

引用なし
パスワード
   やはりプロポーショナルふぉrンとだと厳しいですか。
あきらめて目視で調整します。
回答ありがとうございます。
・ツリー全体表示

【78605】Re:VLOOKUPを使いたい
発言  γ  - 16/11/28(月) 7:35 -

引用なし
パスワード
   Application.WorksheetFunction.Lookup と On Error Go To を組み合わせても可能ですが、
Application.Lookupとすると、エラーにならず、エラー値だけが返されます。
これを利用するとよいでしょう。

↓を参照してください。
ht tps://www.moug.net/tech/exvba/0100035.html

なお、この場合、なんどもVLOOKUPで検索するのは無駄になりますので、
一度だけMatch関数で位置を調べ、
あとはIndex関数を使うか、直接、行番号を使ってセルの値を取り出すのが
効率的でしょう。

なお、そのつど全文引用するのはやめてください。
無駄に長くなります。          
・ツリー全体表示

【78604】Re:VLOOKUPを使いたい
質問  もよもと  - 16/11/28(月) 0:57 -

引用なし
パスワード
   ▼もよもと さん:
>▼佳 さん:
>>こんにちは。
>>
>>なんか、あぶなっかしいですね。
>>VBAを使っても、想定外の使い方をされて 誤ったデータが完成・流通
>>してしまいそうな不安があります。
>>
>>入力用のシート(B列とC〜E列に入力)と、出力用のシート(関数を仕込み、
>>保護を掛けてある)を別にするのはどうですか。
>>
>>
>>▼もよもと さん:
>>>▼β さん:
>>>>▼もよもと さん:
>>>>
>>>>横から失礼します。
>>>>
>>>>>万一手動入力後に取り消ししようとして、関数を消されるとマズイので。
>>>>
>>>>変更されたくないセルに対しては、セルに保護をかけでシートを保護しておくのが
>>>>エクセル利用の常道だと思いますが?
>>>>
>>>>(セル保護は初期値すべてかかっていますので、実際には、全セルの保護を解除して
>>>> あらためて、変更禁止せルに保護を設定した上でシート保護になりますが)
>>>
>>>
>>>βさん
>>>
>>>関数は変更されたくないのですが、そのセルに手動で値は入れたいのです。
>>>また、入力セルは200×10程度あり、その全てに関数を入れると重くなるので。
>
>佳さん
>
>その手もアリですね。
>トライしてみます。

下記のコードでなんとかイメージ通りに出来ましたが、
エラー回避のためにOn Error Gotoを入れると、エラーで
ないものまでエラー判定されてしまい、困っています。
どうしたら、よろしいでしょうか。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rng As Range
  Dim r  As Range
  Set rng = Intersect(Target, Range("$E$8:$E$200"))
  If Not rng Is Nothing Then
  Application.EnableEvents = False
    For Each r In rng
      If r.Value <> "" Then
        r.Offset(, 2).Value = Application.WorksheetFunction.VLookup(r, Sheets("Sheet2").Range("$B$3:$I$200"), 2, False)
        r.Offset(, 3).Value = Application.WorksheetFunction.VLookup(r, Sheets("Sheet2").Range("$B$3:$I$200"), 3, False)
        r.Offset(, 4).Value = Application.WorksheetFunction.VLookup(r, Sheets("Sheet2").Range("$B$3:$I$200"), 4, False)
      Else
        r.Offset(, 2).ClearContents
        r.Offset(, 3).ClearContents
        r.Offset(, 4).ClearContents
      End If
    Next
    Application.EnableEvents = True
    Set rng = Nothing
  End If
End Sub
・ツリー全体表示

【78603】Re:TextBoxになるべく大きく文字を書くに...
発言  亀マスター  - 16/11/25(金) 19:53 -

引用なし
パスワード
   テキストボックスのWidthプロパティ、Heightプロパティはポイント単位でサイズの設定・取得ができ、文字のフォントサイズもポイントサイズで表すので、これを利用すればなんとかなるような気はします。たとえば、Widthが100で文字数が20字なら、フォントサイズを5に設定するとか。ただし、フォントの名前にPが入っているもの(MS Pゴシックなど)は文字ごとに横幅が変わるので、Pのついていないもの限定ですが。

高さに関しては1行の高さが具体的に何ポイントなのか取得・設定がしにくいので、私はよくわかりませんでした。
一応、
テキストボックス.ShapeRange.TextFrame2.TextRange.ParagraphFormat.SpaceWithin
で行間を取得できるのですが、設定が「1行」「2行」のようになっていれば1、2となり、固定値で10ptとなっていれば10となるので、正確に高さを取得できないのです。(できるのかもしれませんがわかりませんでした。)
また、手元で試してみたところ、固定値で高さ145ptで余白0cm、線のサイズ0ptのテキストボックスに、フォントサイズ70ptの字が2行入りませんでした。
・ツリー全体表示

【78602】Re:TextBoxになるべく大きく文字を書くに...
発言  りった  - 16/11/25(金) 18:02 -

引用なし
パスワード
   補足です。
ちなみにテキストは複数行折り返しです。
・ツリー全体表示

【78601】TextBoxになるべく大きく文字を書くには
質問  りった  - 16/11/25(金) 17:52 -

引用なし
パスワード
   固定サイズのTextBoxにマクロでテキストを設定します。
表示しきれなかったらフォントサイズを小さくしたいのですが、
何かいい方法有りますでしょうか?

背景:
・マクロでテキストを設定することは出来ます。
・無条件にフォントサイズを変更することも出来ます。
・「いい感じに」フォントサイズを変更する方法が分かりません。

実際に今作っているのはパワーポイントマクロなのですが、
こちらの掲示板はいつも的確な回答を頂けるのと、
後々Excel VBAでも同じことで困るかもしれないので
質問させて頂きました。
Excel VBAの質問としてのご回答頂ければ幸いです。
・ツリー全体表示

【78600】Re:VLOOKUPを使いたい
お礼  もよもと  - 16/11/24(木) 15:05 -

引用なし
パスワード
   ▼佳 さん:
>こんにちは。
>
>なんか、あぶなっかしいですね。
>VBAを使っても、想定外の使い方をされて 誤ったデータが完成・流通
>してしまいそうな不安があります。
>
>入力用のシート(B列とC〜E列に入力)と、出力用のシート(関数を仕込み、
>保護を掛けてある)を別にするのはどうですか。
>
>
>▼もよもと さん:
>>▼β さん:
>>>▼もよもと さん:
>>>
>>>横から失礼します。
>>>
>>>>万一手動入力後に取り消ししようとして、関数を消されるとマズイので。
>>>
>>>変更されたくないセルに対しては、セルに保護をかけでシートを保護しておくのが
>>>エクセル利用の常道だと思いますが?
>>>
>>>(セル保護は初期値すべてかかっていますので、実際には、全セルの保護を解除して
>>> あらためて、変更禁止せルに保護を設定した上でシート保護になりますが)
>>
>>
>>βさん
>>
>>関数は変更されたくないのですが、そのセルに手動で値は入れたいのです。
>>また、入力セルは200×10程度あり、その全てに関数を入れると重くなるので。

佳さん

その手もアリですね。
トライしてみます。
・ツリー全体表示

【78599】Re:VLOOKUPを使いたい
発言    - 16/11/24(木) 13:54 -

引用なし
パスワード
   こんにちは。

なんか、あぶなっかしいですね。
VBAを使っても、想定外の使い方をされて 誤ったデータが完成・流通
してしまいそうな不安があります。

入力用のシート(B列とC〜E列に入力)と、出力用のシート(関数を仕込み、
保護を掛けてある)を別にするのはどうですか。


▼もよもと さん:
>▼β さん:
>>▼もよもと さん:
>>
>>横から失礼します。
>>
>>>万一手動入力後に取り消ししようとして、関数を消されるとマズイので。
>>
>>変更されたくないセルに対しては、セルに保護をかけでシートを保護しておくのが
>>エクセル利用の常道だと思いますが?
>>
>>(セル保護は初期値すべてかかっていますので、実際には、全セルの保護を解除して
>> あらためて、変更禁止せルに保護を設定した上でシート保護になりますが)
>
>
>βさん
>
>関数は変更されたくないのですが、そのセルに手動で値は入れたいのです。
>また、入力セルは200×10程度あり、その全てに関数を入れると重くなるので。
・ツリー全体表示

【78598】Re:VLOOKUPを使いたい
発言  もよもと  - 16/11/24(木) 12:33 -

引用なし
パスワード
   ▼β さん:
>▼もよもと さん:
>
>横から失礼します。
>
>>万一手動入力後に取り消ししようとして、関数を消されるとマズイので。
>
>変更されたくないセルに対しては、セルに保護をかけでシートを保護しておくのが
>エクセル利用の常道だと思いますが?
>
>(セル保護は初期値すべてかかっていますので、実際には、全セルの保護を解除して
> あらためて、変更禁止せルに保護を設定した上でシート保護になりますが)


βさん

関数は変更されたくないのですが、そのセルに手動で値は入れたいのです。
また、入力セルは200×10程度あり、その全てに関数を入れると重くなるので。
・ツリー全体表示

【78597】Re:VLOOKUPを使いたい
発言  β  - 16/11/24(木) 10:43 -

引用なし
パスワード
   ▼もよもと さん:

横から失礼します。

>万一手動入力後に取り消ししようとして、関数を消されるとマズイので。

変更されたくないセルに対しては、セルに保護をかけでシートを保護しておくのが
エクセル利用の常道だと思いますが?

(セル保護は初期値すべてかかっていますので、実際には、全セルの保護を解除して
 あらためて、変更禁止せルに保護を設定した上でシート保護になりますが)
・ツリー全体表示

【78596】Re:VLOOKUPを使いたい
お礼  もよもと  - 16/11/24(木) 7:35 -

引用なし
パスワード
   ▼γ さん:
>▼もよもと さん:
>>予め全てのセルに関数を入れるのは
>>手間が掛かるからです。
>=IF(B1="","",IFERROR(VLOOKUP(・・・・),"該当なし"))
>などとしておけば、一括してコピーペイストが可能。
>手動入力の場合は式に上書きする、
>ということでよいと思いますが、いかがですか?
>
>どうしてもVBAということなら、具体的に詰まっている点はどこですか?
>
>ワークシート関数をVBA内で使用する方法ですか?
>WorksheetFunction.VLookupのように頭にWorksheetFunctionをつければいいです。
>
>B列に入力した瞬間に計算させたいということなら
>Changeイベントプロシージャを使います。
>www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html#change
>を参考にして下さい。
>(頭のht・・・を省略しています。この質問掲示板のセキュリティ対策上の関係です)
>
>以上の情報をもとにご自分でトライしてみてください。
>詰まったらまた質問して下さい。
>(私は日中はこちらに来ませんが、ほかのかたから支援があるはずです。)
> 
γさん

早速、ご回答頂き有難うございます。
VBAにこだわるのは、作業者に関数をいじられたくない
からです。管理上、コピペ禁止しており、万一手動入力後に取り消ししようとして、関数を消されるとマズイので。また、動作も遅くなることも懸念してます。
まずは教えて頂いた方法でトライしてみます。
・ツリー全体表示

【78595】Re:VLOOKUPを使いたい
発言  γ  - 16/11/24(木) 7:17 -

引用なし
パスワード
   ▼もよもと さん:
>予め全てのセルに関数を入れるのは
>手間が掛かるからです。
=IF(B1="","",IFERROR(VLOOKUP(・・・・),"該当なし"))
などとしておけば、一括してコピーペイストが可能。
手動入力の場合は式に上書きする、
ということでよいと思いますが、いかがですか?

どうしてもVBAということなら、具体的に詰まっている点はどこですか?

ワークシート関数をVBA内で使用する方法ですか?
WorksheetFunction.VLookupのように頭にWorksheetFunctionをつければいいです。

B列に入力した瞬間に計算させたいということなら
Changeイベントプロシージャを使います。
www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html#change
を参考にして下さい。
(頭のht・・・を省略しています。この質問掲示板のセキュリティ対策上の関係です)

以上の情報をもとにご自分でトライしてみてください。
詰まったらまた質問して下さい。
(私は日中はこちらに来ませんが、ほかのかたから支援があるはずです。)
 
・ツリー全体表示

【78594】Re:VLOOKUPを使いたい
発言  もよもと  - 16/11/24(木) 5:57 -

引用なし
パスワード
   はい、VBAでやりたいです。
B列に必ず値を入れるわけではなく、
入れないで他の列に手動で入れる場合も
あり、予め全てのセルに関数を入れるのは
手間が掛かるからです。
・ツリー全体表示

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