Excel VBA質問箱 IV

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

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


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

【77534】Re:コメントサイズの自動調整エラー
発言  β  - 15/10/20(火) 9:57 -

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

>item()には出荷された製品の製品コードが入ります。

情報の内容ではなく、 As Object と規定していますので、そのオブジェクトというのが
具体的に何なんだろう?というのが質問の意図です。

DIctionary なのか、あるいは?
item() と配列指定にしてありますので、どんなオブジェクトなのかなと。

こちらで、再現させてみようとしても、このオブジェクトが何者かがわからないので
引数に与えることができず、再現テストができないので質問しました。
・ツリー全体表示

【77533】Re:コメントサイズの自動調整エラー
発言  くまさん  - 15/10/20(火) 9:35 -

引用なし
パスワード
   念のため印刷を押下した際に実行される最初のコードも記載します。独学で作成したので、読みづらいところも多々あると思いますが、よろしくお願いします。

1つ目のファイルには
 ワークシート1には製品の出荷履歴(X軸には納入月、Y軸には製品コード)
 ワークシート2以降はオーダー毎の受注明細が記載されています。
2つ目のファイルには
 ワークシート1には発注履歴(今回は関係なし)
 ワークシート2には主要な製品の在庫表(入出庫履歴)(X軸には納入月、Y軸には製品コード)が記載されています。


Private Sub Workbook_BeforePrint(Cancel As Boolean)
  Dim xlSheet As Worksheet
  Dim yer As String
  Dim mon As String
  Dim item(4) As Object
  Dim i As Long
  i = 1
  Dim objx As Object
  Dim objy As Object
  Dim WMon As Long
  Dim WItem As Long
  
  ActiveSheet.PageSetup.BlackAndWhite = True

'受注明細を記載したシートのタブの色が赤の時のみ実行されるようにしています。
  If ActiveSheet.Tab.ColorIndex = 3 Then
'xlSheetには1つ目のファイルの出荷履歴のシートがセットされます。
    Set xlSheet = ThisWorkbook.Worksheets("商品マスター")
    With ActiveSheet
'yerには受注明細シートに記載されている納入年を、monには納入月が代入されます。それらの変数を使用し、出荷数を記入すべき出荷履歴シートのX軸を検索します。
      yer = Year(.Range("B5"))
      mon = Month(.Range("B5"))
      Set objx = xlSheet.Cells.Find(What:=DateValue(yer & "/" & mon & "/1"), SearchOrder:=xlByRows, LookIn:=xlFormulas)
'itemには製品コードが入ります。受注明細には最大4製品の売上まで1つのシートに記入できるので、item(4)まで有ります。それらの変数を使用し、出荷数を記入すべき出荷履歴シートのY軸を検索します。
      Set item(1) = .Range("B9")
      Set item(2) = .Range("B14")
      Set item(3) = .Range("B19")
      Set item(4) = .Range("B24")
      Do Until item(i) = ""
        Set objy = xlSheet.Cells.Find(What:=item(i), SearchOrder:=xlByColumns)
'検索されたX軸、Y軸の行、列の情報をそれぞれWMonとWItemに代入します。
        WMon = objx.Column
        WItem = objy.Row
'コメント記入のプロージャーを呼び出します。
        Call WComment(xlSheet, WItem, WMon, item(), i)
'2つ目のファイルに記入するプロージャーを呼び出します
        Call Standard(mon, item(), i)
        
        i = i + 1
      Loop
'受注明細に印刷日時を記入し、タブの色をオレンジに変更します。   
    .Range("I2") = Date
    .Tab.ColorIndex = 7
    End With
    ThisWorkbook.Activate
  End If
End Sub
・ツリー全体表示

【77532】Re:コメントサイズの自動調整エラー
発言  くまさん  - 15/10/20(火) 9:11 -

引用なし
パスワード
   ▼β さん:
ご記入ありがとうございます。
item()には出荷された製品の製品コードが入ります。
1つ目のファイルに記載されている売上情報の中から製品コードを抜き出し、それをクエリに出荷履歴をまとめたシートで出荷数量を記載すべき行を検索します。
売上情報を記載しているシートは1オーダー毎に作成しているため、最大4製品が1シート上に記載されます。


>▼くまさん さん:
>
>本筋には関係ないかもしれませんが、
>
>item() って、どんなオブジェクトですか?
・ツリー全体表示

【77531】Re:do~loop を使った式
発言  β  - 15/10/20(火) 3:38 -

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

ちなみにβなら

問題1 G2 に =SUMPRODUCT((WEEKDAY(A2:A1000)=3)*(C2:C1000))

問題2 A:D列を選択して条件付書式。【数式が】=$B1="鈴木" で 書式でフォント色を赤。
・ツリー全体表示

【77530】Re:do~loop を使った式
発言  β  - 15/10/20(火) 2:43 -

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

これは、学校なんかの課題でしょうか?
課題であれば、その前に、授業で習っているはずで、掲示板で質問して回答されたコードを提出するのは
【インチキ】だと思うんですがねぇ。

また、学校なんかの課題でなければ、Do/Loopを使えという前提は不要で、
この処理にふさわしい組み立て(For/Next 等々)でもいいのでは?

さらにいうなら、

問題1 は G2 に数式を入れる。(必要なら、曜日をセットする作業列をつくる)
問題2 は 領域に条件付書式を設定する。

が、いいのかもしれませんよ。


>問題で悩んでいます。
>ご存知でしたら教えてください
>
>
>日付        担当者    売上
>9月12日    土    鈴木    1,014
>9月13日    日    田村    5,340
>9月14日    月    中村    7,972
>9月15日    火    鈴木    6,686
>9月16日    水    鈴木    3,935
>9月17日    木    中村    9,799
>9月18日    金    田村    1,207
>9月19日    土    田村    4,764
>9月20日    日    中村    9,703
>9月21日    月    田村    1,495
>9月22日    火    中村    3,898
>9月23日    水    田村    5,688
>9月24日    木    鈴木    9,879
>9月25日    金    田村    3,210
>9月26日    土    中村    9,998
>9月27日    日    鈴木    7,632
>9月28日    月    鈴木    3,342
>9月29日    火    田村    7,211
>9月30日    水    田村    6,995
>10月1日    木    中村    2,861
>
>
>Do〜Loopステートメントを使用してください
>
>問題1
>火曜日の売上だけを合計して、セルG2に代入するマクロ
>
>問題2
>「担当者」列をチェックして、もし"鈴木"だったら
>その行のA列からD列までを、赤色の文字にするマクロ
・ツリー全体表示

【77529】do~loop を使った式
質問  質問  - 15/10/19(月) 22:07 -

引用なし
パスワード
   問題で悩んでいます。
ご存知でしたら教えてください


日付        担当者    売上
9月12日    土    鈴木    1,014
9月13日    日    田村    5,340
9月14日    月    中村    7,972
9月15日    火    鈴木    6,686
9月16日    水    鈴木    3,935
9月17日    木    中村    9,799
9月18日    金    田村    1,207
9月19日    土    田村    4,764
9月20日    日    中村    9,703
9月21日    月    田村    1,495
9月22日    火    中村    3,898
9月23日    水    田村    5,688
9月24日    木    鈴木    9,879
9月25日    金    田村    3,210
9月26日    土    中村    9,998
9月27日    日    鈴木    7,632
9月28日    月    鈴木    3,342
9月29日    火    田村    7,211
9月30日    水    田村    6,995
10月1日    木    中村    2,861


Do〜Loopステートメントを使用してください

問題1
火曜日の売上だけを合計して、セルG2に代入するマクロ

問題2
「担当者」列をチェックして、もし"鈴木"だったら
その行のA列からD列までを、赤色の文字にするマクロ
・ツリー全体表示

【77528】Re:コメントサイズの自動調整エラー
発言  β  - 15/10/19(月) 21:48 -

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

本筋には関係ないかもしれませんが、

item() って、どんなオブジェクトですか?
・ツリー全体表示

【77527】Re:コメントサイズの自動調整エラー
発言  くまさん  - 15/10/19(月) 17:41 -

引用なし
パスワード
   ▼ウッシ さん:
ご回答ありがとうございます。
引数について確認いたしましたが、いづれも1回目のコメント書き込みと同様のデータ型を使用しているので、問題ないように思われるのですが。
xlSheetにはWorksheet、WMon,WItemには数値


Sub Standard(mon As String, item() As Object, i As Long)
  Dim xlSheet As Worksheet
  Dim objx As Object
  Dim objy As Object
  Dim WMon As Long
  Dim WItem As Long
  
'エクセルをすでに開いているかの確認。
  If IsBookOpen("主要な製品在庫.xlsx") = False Then
    Workbooks.Open Filename:="C:\Users\User\Dropbox\主要な製品在庫.xlsx"
  End If

'ここでxlSheetにセットしています。
    Set xlSheet = Workbooks("主要な製品在庫.xlsx").Worksheets("標準品在庫")
'objxにコメントを書き込むX軸(売上月)の位置を検索します。
    Set objx = xlSheet.Cells.Find(mon & "月", SearchOrder:=xlByRows, LookAt:=xlWhole)
'objyにコメントを書き込むY軸(製品)の位置を検索します。
    Set objy = xlSheet.Cells.Find(item(i), SearchOrder:=xlByColumns, LookAt:=xlWhole)
’主要な製品ではければ、Subを抜けます。
    If objy Is Nothing Then
      Exit Sub
    End If
'WMonにコメントの書き込み列を、WItemに行をいれます。
    WMon = objx.Column + 1
    WItem = objy.Row
'コメント書き込みのプロージャーを呼び出します。
    Call WComment(xlSheet, WItem, WMon, item(), i)

End Sub


>こんにちは
>
>WCommentを呼び出す際の引数が間違っているのでは?
>
>xlSheetの内容、WItem、 WMonの値を確認して下さい。
・ツリー全体表示

【77526】Re:コメントサイズの自動調整エラー
回答  ウッシ  - 15/10/19(月) 17:12 -

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

WCommentを呼び出す際の引数が間違っているのでは?

xlSheetの内容、WItem、 WMonの値を確認して下さい。
・ツリー全体表示

【77525】Re:コメントサイズの自動調整エラー
発言  くまさん  - 15/10/19(月) 17:08 -

引用なし
パスワード
   ▼ウッシ さん:
早速のご回答ありがとうございます。
記述頂いたコードで実行してみましたが、やはり同じ箇所でエラーが起こります。

Set xlRange = xlSheet.Cells(WItem, WMon)でxlRangeにセットした時点でウォッチウインドウのCommnet.Shape.TextFrame.AutoSizeの欄が”アプリケーション定義または〜"と表示されています。
もし2つ目のファイル呼び出し箇所等、必要なものがあれば追記致しますので、よろしくお願いします。


>こんにちは
>
>どうしてエラーになるのか分からないのですが、
>
>一旦削除して再セットするとどうなりますか?
>
>    If Not xlRange.Comment Is Nothing Then
>      ComTxt = xlRange.Comment.Text & vbCrLf & ComTxt
>    End If
>    On Error Resume Next
>    xlRange.Comment.Delete
>    On Error GoTo 0
>    
>    xlRange.AddComment Text:=ComTxt
>    'コメント欄のサイズを自動調整します。ここでエラー発生(2回めのみ)。
>    xlRange.Comment.Shape.TextFrame.AutoSize = True
>
>原因はちゃんと究明した方がいいですけど・・・
・ツリー全体表示

【77524】Re:コメントサイズの自動調整エラー
回答  ウッシ  - 15/10/19(月) 16:13 -

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

どうしてエラーになるのか分からないのですが、

一旦削除して再セットするとどうなりますか?

    If Not xlRange.Comment Is Nothing Then
      ComTxt = xlRange.Comment.Text & vbCrLf & ComTxt
    End If
    On Error Resume Next
    xlRange.Comment.Delete
    On Error GoTo 0
    
    xlRange.AddComment Text:=ComTxt
    'コメント欄のサイズを自動調整します。ここでエラー発生(2回めのみ)。
    xlRange.Comment.Shape.TextFrame.AutoSize = True

原因はちゃんと究明した方がいいですけど・・・
・ツリー全体表示

【77523】メール自動作成マクロの質問です
質問  SHO  - 15/10/19(月) 15:20 -

引用なし
パスワード
   ネットに展開されているソースを改変して
使用している程度の初心者です。

2度目ですが、皆様のお力を貸していただければと思います。

excelに書いてある内容をメールに書き出すマクロを製作しています。
Outlookを呼び出してメールの作成画面で宛先が自動で入力されているところまでうまく行きましたが、
件名と本文が思うように出力することができません。
objMAIL.subject = "" と objMAIL.body = ""
に関数を入れるところまでは分かっているのですが、
どのように作成すればうまく動くのかご教授願います。

こちらの希望している動きとしては、
・件名に「日報」と今日の日付(MM月DD日(aaa)のフォーマット)が自動で入力される。
・本文には10行目からのセルの内容
 終了行は毎回変わる
 時間が入っているセルにはHH:MMのフォーマットで出力
10行目からのセルには
9:00 〜 9:15
○朝会    
=C10 〜 0:00                
みたいな感じで格納されています。

不足、不明点あればお答えします。
お手数おかけしますが、よろしくお願い致します。
・ツリー全体表示

【77522】コメントサイズの自動調整エラー
質問  くまさん  - 15/10/19(月) 15:14 -

引用なし
パスワード
   はじめまして、自己流でVBA学習中の者です。
コメントサイズの自動調整(XXX.Comment.Visible = True)でエラーが発生し、自己解決が出来そうにないので、質問させていだきます。使用環境はEXCEL2013です。

内容としては、1つ目のファイルでは製品の売上と出荷履歴の管理、2つ目のファイルには主要な製品の出荷管理をしています。
1つ目のファイルに売上の詳細を記入し印刷を押下すると、このファイルに記述されているVBAが呼び出され以下の動作をします。

1.出荷数をまとめた別のワークシートに、注文が入った製品の出荷量を記載する。
2.そのセルにコメント(客先や出荷数など)を記入する。
3.コメントの枠のサイズを自動的に調整する。

主要な製品の場合、2つ目のファイルが呼び出され、上記VBAが再度実行されます。
問題はこの2つ目のエクセルにコメント記入後、サイズを自動調整した際に起こります。
以下がコメントを記入する部分のコードです。

Sub WComment(xlSheet As Worksheet, WMon As Long, WItem As Long, item() As Object, i As Long)
Dim xlRange As Range
Dim ComTxt As String

’ActiviSheetは1つ目のファイルにある売上詳細を記入したワークシートです。
With ActiveSheet
xlSheetは出荷数をまとめたシートです。WMonは出荷月、WItemは売上製品です。(シートには出荷月・売上製品ごとに出荷数をまとめています。)
Set xlRange = xlSheet.Cells(WMon, WItem)
'xlRangeに既に数字(出荷数)が記入されている場合、加算します。
xlRange = .Range("F" & item(i).Row).Value + xlRange.Value
'ComTxt(コメント内容)はActiveSheet(売上詳細のシート)に記載されている日付、客先、出荷数を記載します。
ComTxt = .Range("B5") & " " & .Range("D5") & " " & .Range("F" & item(i).Row).Value & "PC"
'もし、xlRangeにコメントがない場合は新規でコメントを追加します。
If xlRange.Comment Is Nothing Then
xlRange.AddComment Text:=ComTxt
'すでに、xlRangeにコメントがある場合、現在のコメントを改行し、新しいコメントを追記します。
Else
xlRange.Comment.Text Text:=xlRange.Comment.Text & vbCrLf & ComTxt
End If
'コメント欄のサイズを自動調整します。ここでエラー発生(2回めのみ)。
xlRange.Comment.Shape.TextFrame.AutoSize = True
End With
End Sub

エラーメッセージは次のように表示されます。
”アプリケーション定義またはオブジェクト定義のエラーです。”

1つ目のファイルに書き込む際はエラーが起きていないので、別のファイルに書き込むのが問題ないのでしょうか?

以上、ご教授よろしくお願いします。
・ツリー全体表示

【77521】Re:フィルター並べ替え後の検索
お礼  キキ  - 15/10/19(月) 12:00 -

引用なし
パスワード
   β様

お世話になっております。
先日は、迅速にご丁寧に回答頂きありがとうございました。

早速試しましたところ、回答頂いた内容でうまく作動致しました。
大変感謝しております。ありがとうございました。

キキ
・ツリー全体表示

【77520】Re:マクロの繰り返し
発言  β  - 15/10/18(日) 13:27 -

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

G2 に =IF(OR(E2="有",F2="有"),"有","")

こんな式を入れて、最終行までフィルコピーして値をセットさせるという手もありますね。

マナさんの手順を参考にすれば

必要な部品としては

1)A列の最終行セルを求めるマクロ
2)G列の2行めから最終行セルまでのC2:G○ の領域の Formulaプロパティに
  "=IF(OR(E2=""有"",F2=""有""),""有"","""")" を入れて(1行)
3)C2:G○ の Value を C2:G○ のValue で上書き

こうするとループなしで実行できますね。

・ツリー全体表示

【77519】Re:マクロの繰り返し
発言  マナ  - 15/10/18(日) 12:56 -

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

必要な部品としては下記のような感じです

1)A列の最終行セルを求めるマクロ
2)A列の2行めから最終行セルまで繰り返すマクロ
3)A列の4つ右のセル(E列)、5つ右のセル(F列)の値を取得するマクロ
4)A列の6つ右のセル(G列)に値を入れるマクロ
・ツリー全体表示

【77518】マクロの繰り返し
質問  もでぃ  - 15/10/18(日) 11:26 -

引用なし
パスワード
   次のようなコードを作成しました。

Sub sample()
If Range("E2").Value = "有" Or Range("F2").Value = "有" Then
Range("G2").Value = "有"
Else
Range("G2").Value = ""
End If
End Sub

E2セルかF2セルのどちらかに「有」という文字があれば
G2セルに「有」という文字を入れるというものです。

これを「A列の最終行(文字がある行)」まで繰り返し行いたいのですが
やり方がわかりません。

別の言い方をすれば

このシートのE列もしくはF列に「有」があれば
同じ行のG列に「有」をいれる

という意味合いです。

ただ、E列もしくはF列に「有」があったりなかったりしますので
必ず文字がある「A列」の文字があるところまで繰り返したいのです。

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

【77517】Re:参照渡しと値渡し
発言  γ  - 15/10/18(日) 8:59 -

引用なし
パスワード
   間に合いませんでした。

コメントはしますが、返事を求めるものではありません。

>そうでは無くメインルーチンが渡しを決めてサブルーチンを呼ぶことができることを知った
それは事実ではありません。

既に何度も説明がありましたが、
引数に余計なカッコをつけることで、
元の変数とは別の領域にクローンが作成され、
その参照が渡されているだけで、
元の引数の値が変化していないために、ByBalのように見えているだけです。
依然としてByRefであることに変わりはありません。

一方、ByValで定義されているプロシージャを、
呼び出し側でByRefと変更することもできません。
メインルーチン側で渡し方法を決めるなどということはできません。

>サブのほうで渡しを決めるのが基本的
"基本的"ではありません。
例外なく、プロシージャにおける定義に従っています。

呼出元が主導権を握ることができる、ないしコントロールができる、
という認識をお持ちのようですが、それでは、
ByValで定義されているプロシージャを、
ByRefとして機能するメイン側の呼び出し方があるのか、
考えてごらんになると良いでしょう。

---------------------
賄賂云々の譬えを申し上げたが、適切さを欠きました。
というのは、渡す側、受ける側に独立の人格があるような譬えだったからです。

メインプロシージャ、subプロシージャ、functionプロシージャ側に
独立の人格?など無く、各プロシージャーを厳格に定義し、それらを認識した上で、
プロシージャに実行の一部を委ねるのは、同一の主体でしかありません。
各プロシージャの定義を承知したうえで使っているのです。

あたかもそれぞれに意志があるかのような擬人化したモデルで、
コードの理解を図ろうとすると無理が生ずるのではないでしょうか。
・ツリー全体表示

【77516】Re:参照渡しと値渡し
お礼  Nobu10 E-MAIL  - 15/10/18(日) 7:19 -

引用なし
パスワード
   ありがとうございました。
・ツリー全体表示

【77515】Re:参照渡しと値渡し
発言  β  - 15/10/18(日) 6:27 -

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

こちらの掲示板では、↑の Nobu10 さんの【礼】マーク付の解決コメントで終了となります。
(別掲示板とは異なり、そのあとも、Nobu10さん含めて書きこみはできるのですが)
・ツリー全体表示

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