Excel VBA質問箱 IV

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

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


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

【80242】Win32AIPのwaveOut関数を利用する方法
質問  ななみつき  - 18/11/22(木) 13:16 -

引用なし
パスワード
   マルチバッファリングを利用して音を途切れさせずに再生させるためVBAでWin32APIのwaveOut関数を利用したいです。モジュールに下記のように書いてみたのですがエラーも出ないまま落ちてしまいます。どのように改善すればいいでしょうか。

<参考にしたサイト>
ht tp://www13.plala.or.jp/kymats/study/MULTIMEDIA/waveOut_create.html
ht tp://www.chujno.com/admon/ctools/vbapi/apidetail.asp?api_id=531

<動作>バイト配列上の一秒間のサイン波を再生します

<注意>下記のコードを実行するとExcelごと落ちます

Option Explicit
'===============================================
Type WAVEFORMAT
  wFormatTag As Integer
  nChannels As Integer
  nSamplesPerSec As Long
  nAvgBytesPerSec As Long
  nBlockAlign As Integer
  wBitsPerSample As Integer
  cbSize As Integer
End Type

Type WAVEHDR
  lpData() As Byte
  dwBufferLength As Long
  dwBytesRecorded As Long
  dwUser As Long
  dwFlags As Long
  dwLoops As Long
  lpNext As Long
  Reserved As Long
End Type
'----------------------------------------------------
Declare Function waveOutOpen Lib "winmm.dll" _
  (hWaveOut As Long, _
  uDeviceID As Long, _
  format As WAVEFORMAT, _
  dwCallback As Long, _
  fPlaying As Boolean, _
  dwFlags As Long) As Long
  
Declare Function waveOutPrepareHeader Lib "winmm.dll" _
  (hWaveIn As Long, _
  lpWaveInHdr As WAVEHDR, _
  uSize As Long) As Long
  
Declare Function waveOutWrite Lib "winmm.dll" _
  (hWaveOut As Long, _
  lpWaveOutHdr As WAVEHDR, _
  uSize As Long) As Long

Declare Function waveOutGetErrorText Lib "winmm.dll" Alias "waveInGetErrorTextA" _
  (err As Long, _
  lpText As String, _
  uSize As Long) As Long
  
Declare Function waveOutReset Lib "winmm.dll" (ByVal hWaveIn As Long) As Long

Declare Function waveOutUnprepareHeader Lib "winmm.dll" _
  (ByVal hWaveIn As Long, _
  lpWaveInHdr As WAVEHDR, _
  ByVal uSize As Long) As Long
  
Declare Function waveOutClose Lib "winmm.dll" (ByVal hWaveIn As Long) As Long
'----------------------------------------------------
Public Const CALLBACK_FUNCTION = &H30000
Public Const CALLBACK_NULL = 0
Public Const CALLBACK_WINDOW = &H10000
Public Const WHDR_BEGINLOOP = 4
Public Const WHDR_ENDLOOP = 8
Public Const MM_WOM_DONE = &H3BD
Public Const MMSYSERR_NOERROR = 0
Public Const WAVE_FORMAT_PCM = 1

Public Const PIE = 3.141592

'----------------------------------------------------
Dim rc As Long 'return code
Dim hmem(1) As Long ' memory handles
Dim pmem(1) As Long ' memory pointers
Dim hdr(1) As WAVEHDR ' wave headers
Dim hWaveOut As Long ' waveout handle
Dim msg As String * 250 ' message buffer
Dim hwnd As Long ' window handle

'====================================================
Sub main()
  Dim a
  a = play()
End Sub

Public Function play() As Boolean
  Dim wfe As WAVEFORMAT
  Dim whdr As WAVEHDR
  Dim wave() As Byte
  
  wfe.wFormatTag = WAVE_FORMAT_PCM
  wfe.nChannels = 2
  wfe.wBitsPerSample = 8
  wfe.nBlockAlign = wfe.nChannels * wfe.wBitsPerSample / 8
  wfe.nSamplesPerSec = 8000
  wfe.nAvgBytesPerSec = wfe.nSamplesPerSec * wfe.nBlockAlign

  rc = waveOutOpen(hWaveOut, 0, wfe, 0, 0, 0)
  If (rc <> MMSYSERR_NOERROR) Then
    waveOutGetErrorText rc, msg, Len(msg)
    MsgBox msg
    play = False
    Exit Function
  End If
  
  Dim i
  For i = 0 To wfe.nAvgBytesPerSec - 1
    ReDim wave(i)
  Next
  
  For i = 0 To wfe.nAvgBytesPerSec - 1
    wave(i) = 128 + 64 * Sin(2 * PIE * i * 440 / wfe.nAvgBytesPerSec)
  Next
  
  whdr.lpData = wave
  whdr.dwBufferLength = wfe.nAvgBytesPerSec * 2
  whdr.dwFlags = WHDR_BEGINLOOP & WHDR_ENDLOOP
  whdr.dwLoops = 1
    
  rc = waveOutPrepareHeader(hWaveOut, whdr, Len(whdr))
  If (rc <> MMSYSERR_NOERROR) Then
    waveOutGetErrorText rc, msg, Len(msg)
    MsgBox msg
  End If
  
  
  rc = waveOutWrite(hWaveOut, whdr, Len(whdr))
  If (rc <> MMSYSERR_NOERROR) Then
    waveOutGetErrorText rc, msg, Len(msg)
    MsgBox msg
  End If
  
  rc = waveOutReset(hWaveOut)
  If (rc <> MMSYSERR_NOERROR) Then
    waveOutGetErrorText rc, msg, Len(msg)
    MsgBox msg
  End If
  
  rc = waveOutUnprepareHeader(hWaveOut, whdr, Len(whdr))
  If (rc <> MMSYSERR_NOERROR) Then
    waveOutGetErrorText rc, msg, Len(msg)
    MsgBox msg
  End If
  
  rc = waveOutClose(hWaveOut)
  If (rc <> MMSYSERR_NOERROR) Then
    waveOutGetErrorText rc, msg, Len(msg)
    MsgBox msg
  End If
  
End Function
・ツリー全体表示

【80241】Re:Excelでリストの自動入力
発言  γ  - 18/11/21(水) 22:28 -

引用なし
パスワード
   ▼サボテン さん:

>会議がある対象の日にちの上段でプルダウンなどで会議を選択すると
>その参加対象者の予定欄に自動で値が入力するようにしたいのですが

自動で値を入力したいということですが、
その情報はどこにあるのですか?

31日の右側に、会議ごとの入力値を予めセットしておき、
それをコピーペイストするようにしてみてはどうですか?
・ツリー全体表示

【80240】Excelでリストの自動入力
質問  サボテン  - 18/11/20(火) 11:51 -

引用なし
パスワード
   はじめまして、よろしくお願いします。

Excelでカレンダー表示で会議の予定を管理するように言われています。
カレンダー表示で、縦列には参加者の一覧、横列には1日〜31日までの日付で表を作成しています。
会議がある対象の日にちの上段でプルダウンなどで会議を選択するとその参加対象者の予定欄に自動で値が入力するようにしたいのですがどのようにすればよいかご教授いただければと思い投稿させていただきました。

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

【80239】RPAツールとVBA
質問  りった  - 18/11/16(金) 23:31 -

引用なし
パスワード
   RPAツールとVBAは、補完的に使われることが多いものですか?排他的に使われることが多いものですか?

例えば、WEBサイトへの入出力をRPAツールが担当し、データに応じ何をするかの判断等をVBAで記述するのが適切な使い方ですか?

補完的な使い方のイメージ
1.VBAマクロで、やることリストを作る。
2.RPAツールがやることリストをもとに、WEBサイトに入力をする。
・ツリー全体表示

【80238】ActiveWindowがエクセル以外であることを...
質問  りった  - 18/11/13(火) 23:57 -

引用なし
パスワード
   ActiveWindowがエクセル以外であることを調べるにはどうしたら良いでしょうか?

背景:
ブラウザで動作する業務アプリへの打ち込みが面倒なので、
sendKeysによる自動化が出来ないか検証しています。
EXCELでマクロを開始後、SLEEPしている間にALT+TABすれば動作するのですが、
待っているのがだるいですし、逆に時間が足りなかったりしないか心配です。
・ツリー全体表示

【80237】Re:IF文で複数条件を指定する方法
お礼  ABCD  - 18/11/9(金) 15:15 -

引用なし
パスワード
   ▼よろずや さん:

試したところ、想定通りの結果となりました。

初歩的な質問にもかかわらず、
ご親切に回答くださいましてありがとうございました。
・ツリー全体表示

【80236】Re:IF文で複数条件を指定する方法
回答  よろずや  - 18/11/9(金) 13:57 -

引用なし
パスワード
   ▼ABCD さん:
>=================================================
>
> If Range("A" & i).Value = "●" And _
  ( Range("B" & i).Value = "aa" Or _
   Range("B" & i).Value = "bb" ) Then
>            
>   Range("C" & i).Value = "1."
>      
> ElseIf Range("A" & i).Value = "■" And _
    ( Range("B" & i).Value = "aa" Or _
     Range("B" & i).Value = "bb" ) Then
>            
>   Range("C" & i).Value = "2."
> 
> End If
>=================================================

演算子の優先順位を変更するには、
カッコを書く必要があります。
・ツリー全体表示

【80235】IF文で複数条件を指定する方法
質問  ABCD  - 18/11/9(金) 12:49 -

引用なし
パスワード
   例)
  A | B | C |
1| ● | aa | 1. |
|  |  |  |
2| ● | bb | 1. |
|  |  |  |
3| ■ | aa | 2. |
|  |  |  |
4| ■ | bb | 2. |


上記のようなデータがあるとして、C列に結果を入力していく処理を行いたいです。
条件、処理結果は以下の2パターンとします。
---
・A列が"●"且つB列が"aa"または"bb"であればC列に"1."
・A列が"■"且つB列が"aa"または"bb"であればC列に"2."

---

そのため、以下のようにコードを書きましたが上手くいきません。
=================================================

 If Range("A" & i).Value = "●" And _
   Range("B" & i).Value = "aa" Or _
   Range("B" & i).Value = "bb" Then
            
   Range("C" & i).Value = "1."
      
 ElseIf Range("A" & i).Value = "■" And _
   Range("B" & i).Value = "aa" Or _
   Range("B" & i).Value = "bb" Then
            
   Range("C" & i).Value = "2."
 
 End If
=================================================
これを実行すると2つめの処理が上手く動作せず、結果が全て"1."となります。
原因について、どなたか教えてくださいますと幸いです。
・ツリー全体表示

【80234】Re:他ブックのマクロを呼び出しているブ...
お礼  lea  - 18/11/5(月) 12:47 -

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

ありがとうございます!
その方法でやってみようと思います。
・ツリー全体表示

【80233】Re:他ブックのマクロを呼び出しているブ...
お礼  lea  - 18/11/5(月) 12:44 -

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

>ブックB.xlsmにデータ転記のマクロを記述し
>ブックA.xlsxのボタンに上記マクロを登録ではだめですか。

なるほど…Bのほうに記述するというのは考えてませんでした。
そうですね、外部マクロから呼び出すんだったらBから呼び出してもいいですもんね。
やってみます、ありがとうございます!
・ツリー全体表示

【80232】Re:他ブックのマクロを呼び出しているブ...
回答  γ  - 18/11/4(日) 13:15 -

引用なし
パスワード
   私もブックBにマクロを書けばよいと思いました。
ブックAが変わるたびにマクロをコピーするのは無駄でしょう。

ブックAで作業するとき、ブックA自身はActiveWorkbookで特定できるので、
コードに修正は不要ですし、
書込先はThisWorkBookで特定できます。
マクロをコピーしたりする手間は発生しませんし、
マクロは1つだけ作ればよいはずです。

ご指摘どおり、
ブックAのマクロボタンにブックBのマクロを登録すればよいだけです。
まあ、その手間は掛かりますけど。たいしたことじゃない。
・ツリー全体表示

【80231】Re:他ブックのマクロを呼び出しているブ...
発言  マナ  - 18/11/3(土) 12:46 -

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

ブックB.xlsmにデータ転記のマクロを記述し
ブックA.xlsxのボタンに上記マクロを登録ではだめですか。
・ツリー全体表示

【80230】Re:他ブックのマクロを呼び出しているブ...
発言  lea  - 18/11/3(土) 11:31 -

引用なし
パスワード
   もしかして、参照して…って書いたからですかね?

正確に言いますと、ブックAのあるシートで入力をして、別のシートと照らし合わせて、
最終的にブックBに記述を行う、という流れなんです。
作業ブックがAになるので、Aからボタンを押してマクロ実行はしたいです。
・ツリー全体表示

【80229】Re:他ブックのマクロを呼び出しているブ...
発言  lea  - 18/11/3(土) 11:17 -

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

ダメな理由、とはどういうことでしょう…??
普通はマクロを実行したいブックに記述するものではないのですか?
・ツリー全体表示

【80228】Re:他ブックのマクロを呼び出しているブ...
発言  マナ  - 18/11/2(金) 23:05 -

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

ブックAにマクロを記述しないとだめな理由があるのでしょうか。
・ツリー全体表示

【80227】他ブックのマクロを呼び出しているブック...
質問  lea  - 18/11/2(金) 14:52 -

引用なし
パスワード
   お世話になります。
過去ログでも見つけられなかったため、質問いたします。

ブックAを参照してブックBに処理をするマクロがあります。
ブックBはある特定のファイルですが、ブックAは複数あります。
現在、ブックAにマクロを記述し、「ThisWorkbook」で参照ブックを指定しているので、コピペのみでブックAが量産可能です。

しかし…ブックAの数が増えてくると、この先マクロを修正したくなった時に非常に困ります…というか面倒です。
なので、できればマクロ専用のファイルを作成し、ブックAからその専用ファイルを呼び出してマクロの実行をしたいと考えています。

ですが現在「ThisWorkbook」で書いている部分、マクロ専用ファイルから「このマクロを呼び出した呼出元」みたいに書かなければならないと思うのですが…どうやって指定したらいいんでしょう?
もしくは、もっと違う方法とかありますか?

ご教示いただけると嬉しいです。よろしくお願いいたします。
・ツリー全体表示

【80226】Re:特定の文字がある場合のセルに色をつ...
お礼  reo E-MAIL  - 18/10/30(火) 11:05 -

引用なし
パスワード
   返信が遅くなり申し訳ありませんでした。
おかげさまで解決致しました。
ありがとうございました。
・ツリー全体表示

【80225】Re:特定の文字がある場合のセルに色をつ...
発言  マナ  - 18/10/29(月) 20:51 -

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

条件付き書式という機能をご存知でしょうか。
・ツリー全体表示

【80224】Re:『重複したレコードを除いて、Countす...
お礼  もり  - 18/10/29(月) 18:10 -

引用なし
パスワード
   ▼γ さん:
>マルチポストを認めているが、
>マルチしていることを明記してと書いてある。
>それより前に、ここはVBA専用の質問版です。
>すがりつく藁(わら)を間違えています。
>出直しですね〜。

申し訳なかったです。ほかのサイトで質問します。
・ツリー全体表示

【80223】Re:『重複したレコードを除いて、Countす...
発言  γ  - 18/10/29(月) 14:24 -

引用なし
パスワード
   マルチポストを認めているが、
マルチしていることを明記してと書いてある。
それより前に、ここはVBA専用の質問版です。
すがりつく藁(わら)を間違えています。
出直しですね〜。
・ツリー全体表示

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