Excel VBA質問箱 IV

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

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


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

【79604】Re:最終行が取得できません...
回答  γ  - 18/2/2(金) 7:39 -

引用なし
パスワード
   特定のシートモジュールに書かれたプロシージャだったということですか?

シートモジュールのプロシージャでシートを省略すると
「そのプロシージャが書かれたシート」が前提になります。
どのシートがアクティブかは関係しません。

一方、標準モジュールに書かれたプロシージャで、シートを省略すると、
「その時にアクティブなシート」が指定されたことになります。

この違いをよく理解して下さい。

デバッグを最初からしているなら、その結果をキチンと質問中に
織り込んで下さい。そのほうが双方の時間が節約できます。
また、基本的なことが理解されているかも判明しますから。
・ツリー全体表示

【79603】Re:最終行が取得できません...
お礼  [名前なし]  - 18/2/1(木) 23:54 -

引用なし
パスワード
   無事解決いたしました!
デバックももちろん一番に試しましたが、うまくいきませんでした。
シートをアクティブ化することでうまくいきました、ありがとうございました。
P.S.名前が名無しだったのは一度目の投稿で名無しにしてしまったので、次回も名無しのほうがわかりやすいと思ったからです。
▼γ さん:
>> 何か他に設定で変更しきれていなかったり、あるんでしょうか?
>
>その前に、私の助言はどうなりましたか?
>> ステップ実行というデバッグ手法をご存じですか?
>> F8キーを使うものです。
>> それで一行毎に実行して、変数の値が想定どおりとなっているか確認してください。
>
>Application.Run の前まで実行した段階で、
>以下の変数には何が入っているか回答してください。
>
>i
>c_addr1
>c_addr2
>start_cell
>end_cell
>data_range
>
>一つ気になるのは、アドインを使用できる状態になっているかですが、
>分析ツール - VBA はチェックを入れていますよね。
>入れていなければ、別のエラーメッセージのはずなので、そこはOKだと思いますが。
>
>あとは、対象データのあるシートがアクティブシートになっているかぐらいでしょうか。
>
># 名前なし というのはなぜ?
・ツリー全体表示

【79602】Re:VBA 時間集計
回答  γ  - 18/2/1(木) 22:50 -

引用なし
パスワード
   > ZAN の値が 24時間のとき outsh.Cells(Y, 7).Value が 
> 0となります (1900/1/1 0:0:0 ?) 
0ではありません。   
24時間は、整数の1と同じです。
そして、日付型は、1900/1/1 を起点(1) としてカウントする決まりです。
ですから、数式バー? には、1900/1/1 0:00:00 と表示されて正常です。

また、2 は、1900/1/2 0:00:00 と数式バーには表示されます。
そして、そのセルの書式を[h]:mm としておけば、
そのセルは 48:00 と表示されるはずです。

何も問題がありません。
・ツリー全体表示

【79601】Re:VBA 時間集計
発言  初心者CORAZON  - 18/2/1(木) 14:39 -

引用なし
パスワード
   ▼γ さん:
>>VBA側で試してみても、中間フィールドの設定により
>>型が違いますとなります。
>
>現時点のコードを提示して下さい。
ご連絡ありがとうございます。

抜粋すると以下の内容です。

ZAN の値が 24時間のとき outsh.Cells(Y, 7).Value が 
0となります (1900/1/1 0:0:0 ?)
prefsh.Cells(x, 7).Valueとoutsh.Cells(Y, 7).Valueの
帳票EXCEL の書式が [h]:mm です。

---------

 Dim Y As Long
 Dim zan As Date  ← AS Long に変更するとタイプがエラー

 Dim shin As Date
'
 〜途中略〜
'
  If oldcd = prefsh.Cells(x, 1).Value Then
    'その行の 残業・深夜時間
    zan = zan + CDate(prefsh.Cells(x, 7).Value)
    shin = shin + CDate(prefsh.Cells(x, 8).Value)
   Else
 
〜途中略〜
  '結果を保存
  outsh.Cells(Y, 7).Value = zan
・ツリー全体表示

【79600】Re:VBA 時間集計
発言  γ  - 18/2/1(木) 12:51 -

引用なし
パスワード
   >VBA側で試してみても、中間フィールドの設定により
>型が違いますとなります。

現時点のコードを提示して下さい。
・ツリー全体表示

【79599】VBA 時間集計
質問  初心者CORAZON  - 18/2/1(木) 10:41 -

引用なし
パスワード
   VBA初心者です。
よろしくお願いします。

時間集計に困っています。
EXCELシートで 時間のフィールドの時間集計を行います。
担当者ごとの集計でコントロールブレイクを掛けていますので
担当者が変わるまで中間集計をして、担当者が変われば
別のシートの集計エリアにセットします。
別シートの貼り付けたとき、結果表示がうまくいきません。
24時間、48時間 等の場合 ゼロになります。
(日付・時間が混在しているような気がします。)

1.元のシートのセル 時間セル (書式[h]:mm)
2.VBA集計時(担当者が変わるまで)
  中間フィールド ZAN ( as date)
  ZAN = ZAN + cdate(時間セル)
3.担当者変った時セットする セル (書式[h]:mm)

VBA側で試してみても、中間フィールドの設定により
型が違いますとなります。
 
なにかアドバイスがあればお手数をお掛けしますが
よろしくお願いします。
・ツリー全体表示

【79598】Re:最終行が取得できません...
回答  γ  - 18/2/1(木) 7:12 -

引用なし
パスワード
   > 何か他に設定で変更しきれていなかったり、あるんでしょうか?

その前に、私の助言はどうなりましたか?
> ステップ実行というデバッグ手法をご存じですか?
> F8キーを使うものです。
> それで一行毎に実行して、変数の値が想定どおりとなっているか確認してください。

Application.Run の前まで実行した段階で、
以下の変数には何が入っているか回答してください。

i
c_addr1
c_addr2
start_cell
end_cell
data_range

一つ気になるのは、アドインを使用できる状態になっているかですが、
分析ツール - VBA はチェックを入れていますよね。
入れていなければ、別のエラーメッセージのはずなので、そこはOKだと思いますが。

あとは、対象データのあるシートがアクティブシートになっているかぐらいでしょうか。

# 名前なし というのはなぜ?
・ツリー全体表示

【79597】Re:最終行が取得できません...
質問  [名前なし]  - 18/1/31(水) 23:58 -

引用なし
パスワード
   ご回答ありがとうございました。
アドバイス・参考URLを拝見させていただき、再度下記のマクロで実行しましたが、いまだに同様のエラーが発生します。。。何か他に設定で変更しきれていなかったり、あるんでしょうか?

Option Explicit
Sub Histogram()
Dim i
Dim c_addr1
Dim c_addr2
Dim start_cell
Dim end_cell
Dim data_range
i = Cells(Rows.Count, 1).End(xlUp).Row
c_addr1 = 1  '開始行
c_addr2 = i  '最終行
start_cell = "$B$" & c_addr1
end_cell = "$E$" & c_addr2
data_range = start_cell & ":" & end_cell


Application.Run "ATPVBAEN.XLAM!Histogram", ActiveSheet.Range(data_range) _
, "", ActiveSheet.Range("$G$1:$G$10"), False, False, True, False

End Sub


▼γ さん:
>ちなみに、私の手元では正常に動作しました。
>(Option Explicitを無効化したうえですが)
・ツリー全体表示

【79596】Re:エクセルの表を画像としてoutlookに貼...
回答  γ  - 18/1/31(水) 23:01 -

引用なし
パスワード
     高さを指定するなら、
  With .Document.InlineShapes(1)
    .ScaleHeight = 50
    .ScaleWidth = 50
  End With
  のところは以下のようにして下さい。

  Dim ratio as Double
  と宣言しておき、
  With .Document.InlineShapes(1)
    ratio = .Width / .Height
    .Height = 500#    '例。 定数定義しておいたほうがベター
    .Width = ratio * .Height
  End With
  とします。
・ツリー全体表示

【79595】Re:最終行が取得できません...
発言  γ  - 18/1/31(水) 18:43 -

引用なし
パスワード
   ちなみに、私の手元では正常に動作しました。
(Option Explicitを無効化したうえですが)
・ツリー全体表示

【79594】Re:最終行が取得できません...
回答  γ  - 18/1/31(水) 13:06 -

引用なし
パスワード
   ステップ実行というデバッグ手法をご存じですか?
F8キーを使うものです。
それで一行毎に実行して、変数の値が想定どおりとなっているか確認してください。

それと同時に、変数は必ず宣言するようにして下さい。

Option Explicit
をモジュールの一行目に挿入するようにして下さい。
そうすれば、未宣言の変数には警告が出ます。
ht tp://officetanaka.net/excel/vba/beginner/06.htm
を参考にして下さい。

なお、
ツール − オプション − 編集 で
「変数の宣言を強制する」にチェックを入れておけば、
モジュールを作成した時点で、Option Explicitが自動的に挿入されるので、
手間が省けます。
(生涯に一度だけ)チェックを入れておけば、以後、気にする必要はありません。
・ツリー全体表示

【79593】最終行が取得できません...
質問  [名前なし]  - 18/1/31(水) 12:19 -

引用なし
パスワード
   最終行が取得できません...
VBAでヒストグラムを作ろうとしていて、最終行が変化する可能性のあるデータを対象とするため、最終行を関数?で取得して範囲を設定しようと思っています。しかし、以下のマクロではエラーとして「ヒストグラムデータ区間を指定してください」と表記されます。VBAを学び始めたばかりなので、どうかご教授ください。
- - - - - - - - -

Sub Histogram()
LASTROW = Cells(Rows.Count, 1).End(xlUp).Row
c_addr1 = 1  '開始行
c_addr2 = LASTROW  '最終行
start_cell = "$B$" & c_addr1 
end_cell = "$E$" & c_addr2
data_range = start_cell & ":" & end_cell


Application.Run "ATPVBAEN.XLAM!Histogram", ActiveSheet.Range(data_range) _
, "", ActiveSheet.Range("$G$1:$G$10"), False, False, True, False

End Sub
・ツリー全体表示

【79592】Re:エクセルの表を画像としてoutlookに貼...
回答  γ  - 18/1/31(水) 12:12 -

引用なし
パスワード
   【79578】outlookメールにセル貼り付け
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=79578;id=excel
とは同じ方ですか?

貼り付け後の図形を縮小すればどうですか?
1ページに収まるかどうかは本文の多寡にもよりますし、
自動判定は難しいでしょう。
(そうしたことを簡単にリクエストするのはいかがかと思います。
 提示されたコードもなんだかという感じですが。)

テキストベース+添付ファイルとするほうが普通は歓迎されるはずです。
以下は参考まで。

Sub test()
  Dim Ap As Object
  Dim M As Object
  Dim g As Long
  Dim w1 As Worksheet
  
  Set w1 = Worksheets(1)
  g = w1.Cells(Rows.Count, 1).End(xlUp).Row
  w1.Range(w1.Cells(1, 1), w1.Cells(g, 1)).CopyPicture

  Set Ap = CreateObject("Outlook.Application")
  Set M = Ap.CreateItem(0)
  M.BodyFormat = 3      'リッチテキスト形式
  M.To = "test@test";     'アドレス
  M.Subject = "テスト"    '件名
  M.display          '画面を表示
  
  With Ap.Activeinspector.Wordeditor.Windows(1)
    .Selection.Paste
    With .Document.InlineShapes(1)
      .ScaleHeight = 50
      .ScaleWidth = 50
    End With
  End With
End Sub
・ツリー全体表示

【79591】エクセルの表を画像としてoutlookに貼り...
質問  たま E-MAIL  - 18/1/30(火) 8:28 -

引用なし
パスワード
   エクセルの表をoutlookに画像として貼り付けるコードを書きました。
メールを印刷する時にちょうど良いサイズになるよう、貼り付け後のサイズ指定をしたいのですが、どのようなコードを追加すればよいでしょうか。
よろしくお願い致します。

dim ap as object
set ap =createobject("outlook.application")

set w1=worksheets("コメント")
dim g as long
g=w1.cells(rows.count,1).end(xlup).row

with ap.activeinspector.wordeditor.windows(1).selection
w1.select
range(cells(1,1),cells(g,1)).select
selection.copypicture
.paste
.typetext chr(13)&chr(13)
end with
・ツリー全体表示

【79590】★こちらはVBAに関する質問掲示板です★
発言  γ  - 18/1/27(土) 17:52 -

引用なし
パスワード
   ★こちらはVBAに関する質問掲示板です★
質問される方は、まず、基本方針をお読み下さい。
>本サイトの基本方針をまとめました。こちら をご一読ください。

例えば、
>必ず返事をしてください
>回答がついたら、その回答に必ず返事を書いてください。
>それが最低限のエチケットというものです。
とあります。
マナーを守りましょう。
・ツリー全体表示

【79589】Re:EXCELでの勤務時間の管理について
発言  γ  - 18/1/26(金) 19:49 -

引用なし
パスワード
   ここはVBA専門の質問掲示板なので、
関数は別のところで質問してください。
・ツリー全体表示

【79588】EXCELでの勤務時間の管理について
質問  kamikaze  - 18/1/26(金) 17:31 -

引用なし
パスワード
   EXCELで勤務時間をさくっと出せたいようにしたいのですが、
私の店舗は、時間帯ごとに時給が異なる給与システムになっています。(今は手計算です)
時間帯一覧
6:00〜9:00 
9:00〜17:00
17:00〜22:00
22:00〜翌6:00

※一か月の勤務時間の計算は毎月15日締めです。また1分単位で計算しています。

さらに、土曜日曜の9:00〜17:00は基本給+30円という
かなり複雑な給与体系になってます。このような場合どのようにして関数等を組み込めば時間帯ごとの勤務時間がだせるようになりますか?
・ツリー全体表示

【79587】Re:Cells.Findについて(在庫管理システ...
お礼  おはぎ  - 18/1/26(金) 16:31 -

引用なし
パスワード
   Y様

有難うございます!
主にrに取り込んだ情報の操作方法で悩んでいたのですが、
Offsetで操作できるのですね。
これで、完璧に動作しました。

大変助かりました。
また進めていって分からない事があれば、
ここで質問させていただこうと思います。
・ツリー全体表示

【79586】Re:Cells.Findについて(在庫管理システ...
回答  γ  - 18/1/25(木) 23:06 -

引用なし
パスワード
   以下のコード片を参考にしてみてください。

Sub パーツリストから詳細を取得2()
  Dim i As Long
  Dim r As Range
  Dim LastRow As Long

  LastRow = Cells(Rows.Count, 5).End(xlUp).Row

  For i = 6 To LastRow
    Set r = Worksheets("Parts List").Cells.find(Cells(i, 5).Value)
    If Not r Is Nothing Then
      Cells(i, 7).Value = r.Value
      Cells(i, 8).Value = r.Offset(, 1).Value
      ' 以下同様に。
    Else
      MsgBox "該当パーツが見つかりません", vbExclamation
    End If
  Next
End Sub

Findメソッドの引数は省略しないほうがよいでしょう。
マクロ記録をとって調べてみて下さい。
・ツリー全体表示

【79585】Cells.Findについて(在庫管理システム)
質問  おはぎ  - 18/1/25(木) 20:24 -

引用なし
パスワード
   はじめまして。
VBA初心者ですが、会社で在庫管理システムの作成を任され、悪戦苦闘しております。
かなり最初の部分で躓いてしまいました。
過去ログ検索しても分からなかったので、教えて下さい。
作りかけのコードには執着ありませんので、「もっとこうした方が良いよ」などあれば、ご教示頂けるとうれしいです。

◆最終的に作ろうとしているもの
 製品(複数種類)を販売すると、部品毎に在庫が引かれていくシステム。
 カスタム依頼も多いので、対応可能なもの。

◆今作っている部分
 最初の、製品登録画面。
 「Parts List」というシートに、部品の情報がまとまっている。
 それとは別に製品(完成品)ごとのシートを作成し、そこへ必要な部品と数を予め登録する

◆引っかかっている点
 「Parts List」の(B,5)に「Part Number」という項目があり、
  (B,6)以下に1000件程、コードが並んでいる。
  製品ページにてコードを入力すると、「Parts List」
  シートより、以下の情報を自動的に引っ張ってくる。
  1.(C,6)以下のパーツ名
  2.(E,6)以下の製造元会社名
  3.(M,6)以下の値段(原価)
  4.(O,6)以下の値段(販売価格)

◆作成したコード(途中)
Option Explicit

Sub パーツリストから詳細を取得2()

Dim i As Integer
Dim r As Range
Dim LastRow As Long

LastRow = ActiveSheet.Cells(Rows.Count, 6).End(xlUp).Row
'選択中のシートのE列最終行を取得

i = 6

'For i = 6 To LastRow
  
  Set r = Worksheets("Parts List").Cells.Find(Worksheets(ActiveSheet.Name).Cells(i, 5).Value)
  
    If Not r Is Nothing Then
      Cells(i, 7) = Worksheets("Parts List").r.Value
    
      '以降はエラー処理
      Else
      MsgBox "該当パーツが見つかりません", vbExclamation
    End If
  'i = i + 1

'Next

End Sub

◆できないこと
1.変数「r」に代入された「Range」の値を変更する(B列を取得しているが、C,Dと横にずれて、それぞれの値を取得したい)
2.製品シートに値を入れる
3.「ActiveSheet.Cells(Rows.Count, 6).End(xlUp).Row」の部分で、本当は「5(E列)」にしたいが上手く機能しない。
  (今入っているのは「LPA239」などの記号)
  仕方なく、製品ページのF列に「=IF(E6="","","○")」を入れて、無理やり認識させている。
4.その他、進行するごとに質問が多数出てくると思います…
・ツリー全体表示

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