Excel VBA質問箱 IV

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

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


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

【77967】PowerPointファイルをmp4形式で保存した...
質問  初学者オクダ  - 16/2/21(日) 18:57 -

引用なし
パスワード
   相談にのってください。お願いします。(Excel、PowerPointともに2013)
現在、ExcelVBAから特定フォルダ内のPowerPointをすべてmp4形式に変換しようと作業を進めております。
まずは1ファイルから、、、ということでインターネットの情報を見よう見まねでこのようなコードを打ってみましたがうまく動きません。
(SaveAs 列挙値が無効です、というメッセージでます。)

---------------------------------------------------------
ExcelのシートにコマンドボタンMP4を準備。クリックして実行。

Private Sub MP4_Click()

  Dim objPPT As Object
  Dim myPre As Object
  
  'ppt起動
  Set objPPT = CreateObject("PowerPoint.Application")
  
  'ファイル開く
  Set myPre = objPPT.Presentations.Open("ファイルA.pptx", True)
  
  '★★★★ファイルの保存(ここで実行エラー)★★★★★★
  objPPT.ActivePresentation.SaveAs FileName:="ファイルB.mp4", FileFormat:=ppSaveAsMP4
 
End Sub
--------------------------------------------------
objPPT.ActivePresentation.SaveAs FileName:="ファイルB.pptx"
の場合には上手くいったので、あとは引数かなといじってみたところエラーになってしまいます。PowerPointVBAについては全くと言っていいほど知識がないため、途方に暮れております。

どうすれば解決できるか、お知恵をお借りできますでしょうか。情報に不足があれば仰ってください。何卒よろしくお願いします。
・ツリー全体表示

【77966】Re:勤怠システムを自作したい
発言  β  - 16/2/21(日) 17:30 -

引用なし
パスワード
   ▼作りたい初心者 さん:


ichinoseさん指摘通り、よくないサンプルでした。
私のコードを参考にしていただくなら、
標準モジュールの UserForm1.Label1.Caption = "時刻表示お休み中" を消し
ユーザーフォームモジュールの CommandButton1.Caption = "時刻表示再開" の下に
Label1.Caption = "時刻表示お休み中" を入れてください。
・ツリー全体表示

【77965】Re:勤怠システムを自作したい
発言  β  - 16/2/21(日) 17:22 -

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

>UserForm1.Label1.Caption = "時刻表示お休み中"
>
>こんなコードがあるのです。
>ということは、一旦UnloadされたUserForm1は再びLoadされます。

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

【77964】Re:勤怠システムを自作したい
発言  ichinose  - 16/2/21(日) 16:53 -

引用なし
パスワード
   >ichinoseさんのコードでは Terminateイベントを使っておられますね。
>私のコードでは QueryClose を使ったわけですけど、閉じるボタンで
>QueryClose が実行されないケースがあるということでしょうか?

ユーザフォームの閉じるイベントは関係ないです。
やってみれば、わかります。
QueryCloseとTerminateの違いは、QueryCloseは、ユーザフォームの消去を状態によって
制御できるが、Terminateはできない ですよね?

現状、QueryCloseでは、閉じない制御をしているわけではないのです。

βさんのコードでは、
QueryCloseでもTerminateでもイベントは実行されています。

問題はイベント実行後です。
イベントは実行されているのですから、標準モジュールのループは抜けます。

が、その後、

UserForm1.Label1.Caption = "時刻表示お休み中"

こんなコードがあるのです。
ということは、一旦UnloadされたUserForm1は再びLoadされます。

Loadされれば、最初に発生するのがInitializeイベントですよね!!

プログラムは終わりませんよね!!
・ツリー全体表示

【77963】Re:勤怠システムを自作したい
発言  β  - 16/2/21(日) 12:31 -

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

いつも、ありがとうございます。

>βさんのコード時計表示中に閉じるボタンクリックでコードが終わらない可能性がありますよ!!

ichinoseさんのコードでは Terminateイベントを使っておられますね。
私のコードでは QueryClose を使ったわけですけど、閉じるボタンで
QueryClose が実行されないケースがあるということでしょうか?

ご教示いただければ幸いです。
・ツリー全体表示

【77962】Re:勤怠システムを自作したい
発言  ichinose  - 16/2/21(日) 11:15 -

引用なし
パスワード
   ▼作りたい初心者 さん:
>で、現時点ではリアルタイムな時刻表示をするにはどうしたらいいのか迷っています。

VBAの関数 Now関数または、ワークシート関数のNow()関数(VBA内では、[Now()]と記述)

この二つぐらいの投稿で十分だと思いますが、ちょっと私的新発見があったので
投稿します。


新規ブックにて

ユーザーフォームを作成してください(UserForm1)。

このUserForm1には、 ラベル(Label1)とコマンドボタン(CommandButton1)を
一つずつ配置してください。


UserForm1のモジュール


Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private 表示 As Boolean
'==============================================================
Private Sub CommandButton1_Click()
  表示 = Not 表示
  If 表示 Then
    CommandButton1.Caption = "時刻表示中止"
    dspclock
  Else
    CommandButton1.Caption = "時刻表示再開"
  End If
End Sub
'================================================================
Sub dspclock()
  Do While 表示
    Label1.Caption = Now()
    DoEvents
  Loop
End Sub
'===============================================================
Private Sub UserForm_Activate()
  CommandButton1 = True
End Sub
'=================================================================
Private Sub UserForm_Terminate()
  表示 = False
End Sub


標準モジュールに

Sub test()
  UserForm1.Show
End Sub

これでtestを実行して試してみてください


時計表示がされると思います。
このプロフラムに近い物を理由は不明ですが、10年以上前に作った覚えがあります。
Win2000+Excel2000か2002だったと思います。


私的新発見とは・・・。

時刻をラベルに表示し、あたかも時計が動いているように見せるためにラベルに時刻を表示し続けるのがポイントだという事はちょっとVBAを学べはわかります。

プロシジャーで言うと、

Sub dspclock()
  Do While 表示
    Label1.Caption = Now()
    DoEvents
  Loop
End Sub

これなんですが、

この中で Doevents という記述がありますが、これ入れないとUserForm1は、真っ白のままで何も表示されない状態になってしまいます。

そこでワンクッションのつもりでDoeventsをはさむと見事にデジタル時計が表示される
のですが・・・・。

Excel2000Or2002の時、作ったものだと Doeventsだけを入れてループさせると
CPUの占有率が100%になってしまう現象が見られました。

時計を表示させるぐらいで100%ではやばい ということでAPIのSleepをDoeventsと
一緒に使う事で占有率は、まあいいだろうという程度に下がりました。
この時の経験等で DoeventsとSleepは、セットで使う癖が今でも付いています。

今回の質問で投稿した内容、Doeventsだけでも
CPU占有率は25%程度だったことが私的発見でした。

10年前に作成したストップウォッチでも同様の結果でした。
Win7+Excel2010で試した結果です。


因みに


Sub dspclock()
  Do While 表示
    Label1.Caption = Now()
    DoEvents
    Sleep 50
  Loop
End Sub

なんてすると、占有率は、0%〜2%程度でした。


βさんのコード時計表示中に閉じるボタンクリックでコードが終わらない可能性がありますよ!!
・ツリー全体表示

【77961】Re:勤怠システムを自作したい
お礼  作りたい初心者  - 16/2/21(日) 11:04 -

引用なし
パスワード
   ▼β さん:
迅速に教えてくださりありがとうございます、サンプル実行したところ動作しました、ここまで分かれば自分なりにアレンジして使えそうです。
おそらく次はデータベース関係でご質問させていただくことになりそうですが、その際はまたよろしくお願い致します。
・ツリー全体表示

【77960】Re:勤怠システムを自作したい
発言  β  - 16/2/21(日) 8:30 -

引用なし
パスワード
   ▼作りたい初心者 さん:

1つの方法のサンプルとして。
ユーザーフォームに Label1 と CommandButton1 を配置してください。

●ユーザーフォームモジュール


Private Sub CommandButton1_Click()
  DoLoop = Not DoLoop
  If DoLoop Then
    CommandButton1.Caption = "時刻表示中止"
    Application.OnTime Now(), "今何時"
  Else
    CommandButton1.Caption = "時刻表示再開"
  End If
End Sub

Private Sub UserForm_Initialize()
  CommandButton1.Caption = "時刻表示中止"
  DoLoop = True
  Application.OnTime Now(), "今何時"
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  DoLoop = False
End Sub

●標準モジュール

Public DoLoop As Boolean

Sub 今何時()
  
  Do While DoLoop
    UserForm1.Label1.Caption = Now
    DoEvents
  Loop
  
  UserForm1.Label1.Caption = "時刻表示お休み中"
  
End Sub
・ツリー全体表示

【77959】勤怠システムを自作したい
質問  作りたい初心者  - 16/2/20(土) 23:11 -

引用なし
パスワード
   今勤怠システムをつくるためにエクセルVBAのユーザーフォームを勉強しています。
名前をコンボボックスで選択し、オプションボタンで操作を指定、リアルタイムな時間表示を行い、操作ボタンをクリックするとその時刻で打刻されるエクセルシートにはデータを格納していくというプログラムを作りたいと考えています。

で、現時点ではリアルタイムな時刻表示をするにはどうしたらいいのか迷っています。

アイディアを頂きたく存じます。
・ツリー全体表示

【77958】Re:重複処理、合計計算
お礼  VBA初心者  - 16/2/17(水) 14:59 -

引用なし
パスワード
   ▼β さん:
>▼VBA初心者 さん:
>
>A列、B列のデータ処理はアップしたコードでOKですよね。
>ただ、そこで作業列に使ったD列には、他のデータがありそうですから
>コード内でD列を使っているところをたとえば X列に、E列を使っているところをY列に変更しましょう。
>
>で、今度は、D列、E列に対して同じことをしたいのですよね。
>であれば、まずは、A,B列を処理しているコードをコピーして、
>このAにあたるところをDに、BにあたるところをEに直せば
>処理できますよね?
>
>もちろん、同じような処理が2つ書かれるわけで冗長なコードですけど
>まずは、そのようにして対処されてはいかがでしょう。
>
>その後、もし、同じようなこの2つの処理をループで回す1つのコードにまとめたいということがあれば
>それはそれで、次のテーマとして対応されたらよろしいかと思います。
>
>まずは自分でやってみましょう。

ありがとうございます。 自分の為にも頑張ってみます。m−ーm
・ツリー全体表示

【77957】Re:重複処理、合計計算
発言  β  - 16/2/17(水) 14:41 -

引用なし
パスワード
   ▼VBA初心者 さん:

A列、B列のデータ処理はアップしたコードでOKですよね。
ただ、そこで作業列に使ったD列には、他のデータがありそうですから
コード内でD列を使っているところをたとえば X列に、E列を使っているところをY列に変更しましょう。

で、今度は、D列、E列に対して同じことをしたいのですよね。
であれば、まずは、A,B列を処理しているコードをコピーして、
このAにあたるところをDに、BにあたるところをEに直せば
処理できますよね?

もちろん、同じような処理が2つ書かれるわけで冗長なコードですけど
まずは、そのようにして対処されてはいかがでしょう。

その後、もし、同じようなこの2つの処理をループで回す1つのコードにまとめたいということがあれば
それはそれで、次のテーマとして対応されたらよろしいかと思います。

まずは自分でやってみましょう。
・ツリー全体表示

【77956】Re:重複処理、合計計算
発言  VBA初心者  - 16/2/17(水) 13:09 -

引用なし
パスワード
   ▼β さん:
>▼VBA初心者 さん:
> 再掲します。
>
> 1.A列を D列にコピペ
>2.D列を選択して データタブ 重複の削除(先頭がタイトル行にチェック)
>   アップされた例なら D1:D7 に縮まります。
> 3.E1にB1のタイトル項目をコピー
>3.E2:E7を選択し  =SUMIF(A:A,D2,B:B) これをタイプして Ctrl/Enter。
> 4.D:E列を選択して Ctrl/c 。そのまま 形式を指定して【値】貼り付け。
> 5.そのまま Ctrl/x。
> 6.A1を選択して Ctrl/v。
>
>
>この操作をマクロ記録し、それを(かなり)お化粧直ししたのが以下のコードです。
>
>Sub Sample()
>  Columns("A").Copy Range("D1")
>  Columns("D").RemoveDuplicates Columns:=1, Header:=xlNo
>  Range("E1").Value = Range("B1").Value
>  With Range("D2", Range("D" & Rows.Count).End(xlUp))
>    .Offset(, 1).Formula = "=SUMIF(A:A,D2,B:B)"
>    .Offset(, 1).Value = .Offset(, 1).Value
>  End With
>  Columns("D:E").Cut Range("A1")
> End Sub
>
>

早速の回答ありがとうございます。せっかくコードを教えてくださったのに最初の条件の追加でもうしわけございませんが、DとEコラムの重複も同時に無くしたいのですが、ご教授おねがいしてもよろしいでしょうか?DとEコラムも、Aコラムと同じ状態で両方ともRow2から始まります。
・ツリー全体表示

【77955】Re:重複処理、合計計算
発言  β  - 16/2/17(水) 8:15 -

引用なし
パスワード
   ▼VBA初心者 さん:
再掲します。

1.A列を D列にコピペ
2.D列を選択して データタブ 重複の削除(先頭がタイトル行にチェック)
  アップされた例なら D1:D7 に縮まります。
3.E1にB1のタイトル項目をコピー
3.E2:E7を選択し  =SUMIF(A:A,D2,B:B) これをタイプして Ctrl/Enter。
4.D:E列を選択して Ctrl/c 。そのまま 形式を指定して【値】貼り付け。
5.そのまま Ctrl/x。
6.A1を選択して Ctrl/v。


この操作をマクロ記録し、それを(かなり)お化粧直ししたのが以下のコードです。

Sub Sample()
  Columns("A").Copy Range("D1")
  Columns("D").RemoveDuplicates Columns:=1, Header:=xlNo
  Range("E1").Value = Range("B1").Value
  With Range("D2", Range("D" & Rows.Count).End(xlUp))
    .Offset(, 1).Formula = "=SUMIF(A:A,D2,B:B)"
    .Offset(, 1).Value = .Offset(, 1).Value
  End With
  Columns("D:E").Cut Range("A1")
End Sub


・ツリー全体表示

【77954】Re:重複処理、合計計算
発言  β  - 16/2/17(水) 8:09 -

引用なし
パスワード
   ▼VBA初心者 さん:

↑ 1行目からデータだと勘違いした手順とコードでした。
後ほど、2行目からのものに対する手順とコードを再掲します。
・ツリー全体表示

【77953】Re:重複処理、合計計算
発言  β  - 16/2/17(水) 6:34 -

引用なし
パスワード
   ▼VBA初心者 さん:

トピの目的が、ループ処理の構文を身につけたい、勉強したいということなのか
このテーマを、自分でもわかる方法で実行したいのか、それがわかりませんが
後者で。

1.A列を D列にコピペ
2.D列を選択して データタブ 重複の削除 アップされた例なら D1:D6 に縮まります。
3.E1:E6を選択し  =SUMIF(A:A,D1,B:B) これをタイプして Alt/Enter。
4.D:E列を選択して Ctrl/c 。そのまま 形式を指定して【値】貼り付け。
5.そのまま Ctrl/x。
6.A1を選択して Ctrl/v。

この操作をマクロ記録し、それを(かなり)お化粧直ししたのが以下のコードです。

Sub Sample()
  Columns("A").Copy Range("D1")
  Columns("D").RemoveDuplicates Columns:=1, Header:=xlNo
  With Range("D1", Range("D" & Rows.Count).End(xlUp))
    .Offset(, 1).Formula = "=SUMIF(A:A,D1,B:B)"
    .Offset(, 1).Value = .Offset(, 1).Value
  End With
  Columns("D:E").Cut Range("A1")
End Sub
・ツリー全体表示

【77952】重複処理、合計計算
質問  VBA初心者  - 16/2/17(水) 4:18 -

引用なし
パスワード
   質問させてもらいます。宜しくお願いします。

Aコラムに名前が入力されてあり(名前の数、名前は変化するとします。)、そしてBコラムに時間(時間、時間が入力してある行も変化するとします)が入力されてあるとします。



Aカラム  Bカラム
(名前と数字はそれぞれA2、B2から始まるとします)
佐藤    12
田熊    35
伊藤    23
本田    87
豊田    24
松田    23
松田    11
伊藤    34

このシート1に入力された情報を名前の重複を無くし、またそれと一緒に時間をそれぞれの名前にカウントしたいのです。下記が処理後にシート1に表示させたい情報です。


Aカラム  Bカラム
(名前と数字はそれぞれA2、B2から始まるとします)
佐藤   12
田熊   35
伊藤   57
本田   87
豊田   24
松田   34

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

【77951】Re:一定以上の数値に色づけをしたい
お礼  初心者A  - 16/2/16(火) 16:29 -

引用なし
パスワード
   ▼β さん:
>▼初心者A さん:
>
>で、yutoさんや私のコード、試した結果はいかがでしたか?


▼β さんへ
yutoさんへ
お礼の返事が遅れてすいません。
大変参考になりました。
yotoさのコードでためしました。
また、ご教授お願いします。
・ツリー全体表示

【77950】Re:一定以上の数値に色づけをしたい
発言  β  - 16/2/16(火) 7:44 -

引用なし
パスワード
   ▼初心者A さん:

で、yutoさんや私のコード、試した結果はいかがでしたか?
・ツリー全体表示

【77949】Re:一定以上の数値に色づけをしたい
回答  初心者A  - 16/2/15(月) 21:59 -

引用なし
パスワード
   ▼β さん:
>▼初心者A さん:
>
>う・・・ん・・・
>
>データ、なにも A1 をさんしょうしなくても、じどうはんていはできるんですが
>まぁ、A1 がデータ数だとしましょう。
>>▼β さん:
>>>▼初心者A さん:
>
>う〜ん・・・・
>
>データ件数は 何も A1 を参照しなくても自動把握は可能ですが、
>まぁ、A1 がデータ件数だとしましょう。
>
>質問しているのは、
>
>アップしたコードを実行して、どんな不具合があったのですか
>
>ということです。
>
>まぁ、ループの最初で実行時エラーになったんだと思いますが。
>
>マクロ内で、セルに数式を入れる場合、その数式は、セルに入力するまんまの文字列を
>" で囲んで指定します。
>
>セットすべき数式は、たとえば =SUM(C1:G1) という文字列ですよね。
>
>"=SUM(Cells(" & i + 2 & ",1):Cells(" & i + 2 & ",7))"
>
>これでは、たとえば
>
>=SUM(Cells(3,1):Cells(3,7))
>
>こんな数式文字列になります。なので、エクセルは、こんな名前、知らないよ!
>ということで #NAME? と表示してますよね。
>このエラー値になっているセルのValue を参照しようとすると実行時エラーになります。
>
>もし数式を入れるなら
>
>Cells(i, 2).Formula = "=SUM(C" & i & ":G" & i & ")"
>
>ですね。
>
>数式を入れず、VBA内でワークシート関数のSUMを使って合計した値をB列にセットすることも
>もちろんできますが。
>
>しかし、比べる数字が、6 になったり 8 になったりするのでしょ?
>そのたびにマクロを修正するのですか?
>
>コメントしたように、データ件数は自動で把握できますので、むしろ A1 には 
>比べる数字をいれ、それを使ったほうがよろしいのでは?

>>▼β さんへ
早々の返信ありがとうございます。
説明が足りなくてすいません。
しかし、比べる数字が、6 になったり 8 になったりするのでしょ?
変動するのは確かですが、Inputboxで対応しようかと考えていました。
・ツリー全体表示

【77948】Re:一定以上の数値に色づけをしたい
発言  β  - 16/2/15(月) 21:24 -

引用なし
パスワード
   ▼初心者A さん:

処理例です。

コメントした通りデータ行数はA1を参照しなくても取得できますので A1 は無視しています。
比べるべき数字 5 であたり、10 であったり、変更のつど、マクロを修正するのは感心しませんので
セルに入力して指定します。仮に、そのセルを A2 にします。

Sample1 は条件付書式に色塗りを任せます。Sample2は比較して色塗りします。
βとしては Sample1 がおすすめです。

Sub Sample1()

  With Range("A1", ActiveSheet.UsedRange)   'このシートのA1から使用領域最後までの領域
    .Columns("B").Formula = "=SUM(C1:G1)"  '使用領域のB列に、数式を一括設定。
  End With
  
  With Columns("B")
    .FormatConditions.Delete
    .FormatConditions.Add Type:=xlExpression, Formula1:= _
            "=AND($A$2<>"""",B1<>"""",SUM(C1:G1)>$A$2)"
    With .FormatConditions(1).Interior
      .PatternColorIndex = xlAutomatic
      .ColorIndex = 7
      .TintAndShade = 0
    End With
  End With

End Sub

Sub Sample2()
  Dim c As Range
  
  With Range("A1", ActiveSheet.UsedRange)   'このシートのA1から使用領域最後までの領域
    .Columns("B").Formula = "=SUM(C1:G1)"  '使用領域のB列に、数式を一括設定。
  End With
  
  Columns("B").Interior.ColorIndex = xlNone  '処理前に色をクリア
  
  For Each c In Range("B1", Range("B" & Rows.Count).End(xlUp))
    If c.Value > Range("A2").Value Then c.Interior.ColorIndex = 7
  Next
  
End Sub
・ツリー全体表示

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