1.[2弾-183]実行状況をプログレスバーで表示

[2001/01/21 H.Oさんからの質問]

「500連発マクロ」、大変面白く参考にさせていただいております。 その中で一つ、参考にしたいのですがどうしても使い方がわからない物があります。 自分で作ったマクロの稼働状況を見たいため、No.183の「実行状況をプログレス バーで表示する(ラベル)」を活用したいのですが、使い方がわかりません。 貴社のマクロのなかに、自分のマクロを入れたのですがうまくいきません。 自分のマクロを添付します。二日かかってもうまくいかないもやもやを解決したいの で、どうかよろしくお願いします。



Sub tanaorosi()
 --- 略 ---
Do
    Num = ws.Cells(RowPos, ColPos + 1)
    If Num = "梱包" Then
        ws.Cells(RowPos, ColPos - 9).Copy
        ws2.Cells(RowPos, ColPos - 9).PasteSpecial Paste:=xlPasteValues
    End If
    RowPos = RowPos + 1
Loop While Num <> "end"
--- 略 ---
End Sub

質問はDoステートメント使用のマクロですが、私の掲載している例題は%を 表示する関係で最終値の判っているForステートメントが対象です。 質問のサンプルはForでも出来そうなので最終セルを取得し下記に変更しました。

Sub tanaorosi()
 --- 略 ---
    Selection.SpecialCells(xlCellTypeLastCell).Select
    endr = ActiveCell.Row
For RowPos = 5 To endr
       Num = ws.Cells(RowPos, ColPos + 1)
        If Num = "梱包" Then
            ws.Cells(RowPos, ColPos - 9).Copy
            ws2.Cells(RowPos, ColPos - 9).PasteSpecial Paste:=xlPasteValues
        End If
Next
--- 略 ---
End Sub
 ---------------------------------------
上記に変更後、プログレスバーで表示を追加しました。なお、自分の作成した
Forステートメントの中にマクロを追加する件が判りずらいようなので、今回
下記のように分割しました。自分の作成したマクロに、Call puro1・・Call puro4
を追加すればよい。(追加個所は下記参照のこと)

Dim i As Integer
Dim j As Integer
Dim endr As Integer
Dim tsiz As Integer
Sub tanaorosi()
 --- 略 ---
Call puro1
For RowPos = 5 To endr
i = RowPos
Call puro2
       Num = ws.Cells(RowPos, ColPos + 1)
        If Num = "梱包" Then
            ws.Cells(RowPos, ColPos - 9).Copy
            ws2.Cells(RowPos, ColPos - 9).PasteSpecial Paste:=xlPasteValues
        End If
Call puro3   
Next
Call puro4
--- 略 ---
End Sub
'-----------------------------
Sub puro1()
'ダイアログへ表示
With UserForm1
    .Caption = "マクロ実行中:しばらくお待ち下さい"
    .Label1.BackColor = RGB(255, 255, 0)
    .Label2.TextAlign = fmTextAlignCenter
    .Label2.BackStyle = 0
    .Label1.Width = 0
    tsiz = .Label2.Width
End With
UserForm1.Show vbModeless
End Sub
'-----------------------------
Sub puro2()
'進行計算
    j = i / endr * 100
    With UserForm1
        .Label2.Caption = Int(j) & "%"
        .Label1.Width = tsiz * j / 100
    End With
End Sub
'-----------------------------
Sub puro3()
'プログレス表示
   DoEvents
End Sub
'-----------------------------
Sub puro4()
'ダイアログを閉じる
  Unload UserForm1
End Sub
'-----------------------------
2001/1/22 (月) 21:51 下記メールを受信
井領さん、なんとお礼を申し上げてよいかわかりません。 正直、編集部宛にメールを出して、返事が来るのか だめもとの気持ちでした。 それが次の日に、しかもマクロを添削してくれて返事が来るなんて! マクロは動きました。感激です! もしこのまま完成せず、もやもやした気持ちのままのコンピューターライフだったら、 マクロへの興味は薄れていったかもしれません。 ますますマクロが面白くなりました! 有り難うございました。

2.[2弾-他1]テキストボックスの日付型表示

[2001/02/07 S.Zさんからの質問]
ExcelVBAマクロ500連発を購入しました。 教えてほしいことがあるのですが、 テキストボックスの値を日付型(例えば)2001/1/2というように、 設定したいのですが、どうすればいいのでしょうか?

------------------------------------------------------------
何処にあるテキストボックスか上記では判りませんが、もしワークシート上 に書いたテキストボックスであればFormatの指定は出来ないと思います。

ユーザーフォームに書いたテキストボックスなら日付型の指定が出来ます。 下記のMacro1の方は、UserForm1を表示させTextBox1に1/2と入力しダブルクリック すれば2001/1/2になります。

Macro2の方は、セル"A1"に1/2と記述しこのマクロを実行すればテキストボックス に2001/1/2と表示されます。(2001はPCのシステム日付が2001の場合)

Sub Macro1()
    UserForm1.Show
End Sub
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
   UserForm1.TextBox1.Text = Format(UserForm1.TextBox1.Text, "yyyy/m/d")
End Sub

'------------------------------------------------------------
Sub Macro2()
    UserForm1.Show
    ddd = Range("A1").Value
    UserForm1.TextBox1.Value = Format(ddd, "yyyy/m/d")
End Sub
質問の内容と異なっているようでしたら再度メールを下さい。
3.[2弾-171]オ-トフィルタで抽出し結果を別シートへ張付

[2001/02/23 M.Tさんからの質問]
初めてお便りします。 私はVBAを始めた54歳の初心者です。VBAマクロ500連発を 参考にして勉強しています。 非常に初歩的な質問で申し訳ないのですが、 是非教えて下さい。

number171"オートフィルターの抽出結果を追加した シートに貼り付ける"に関しての質問です。 小生のデータベースには、受注日列 2001/04/01と 納期列 2001年4月10日と二つの検索したい列が あります。顧客番号とか顧客名とかでは、スムーズに 動作してくれるのですが、この2列の検索は上手く いきません。 原因は日付の文字列と、入力した数値が検索で 一致しないからだと思います。 試した事は
[1]textbox1に、かなで2001年4月10日と入力。
[2]々     、かなで2001/04/10。
[3]Textbox1.Value=Format(Textbox1.Value,"yyyy/mm/dd")
[4]intyear=(CDate(Userform1.Textbox1.Text))
month,dayも同様にして
 Textbox1Text=intyear & "年” & intmonth & "月".......
[5]"yyyy""年""mm""月""dd""日"""
と代入してもいずれも敗退しました。

成功したのは、 この2列のセル書式を標準にして、シリアル値に変換 すれば、シリアル値でオートフィルターは可能なのですが、 テキストボックスにシリアル値を入れるのは難しいです。 テキストボックスには、出来れば04/01、駄目ならば 2001/04/01といった日付入力をして検索したいのです。 値の一致のさせ方を教えて下さい。ここで詰まって3日目 なのでお助け下さい。
------------------------------------------------------------
先週下記のような質問があり、29-73へ掲載しました同じ内容ですがここにも掲載します。
「ユーザーフォーム上にふたつのテキストボックスがあり、 それぞれ、シート1のA列とB列に入っているデータを記入し、 コマンドボタンを押すと、そこから検索して、C列のデータを探して、 ユーザーフォーム上のラベル1に表示させたいのですが、どのように すればよろしいのでしょうか?」




上図のようにダイアロルへ入力すると、左図のように表示するマクロの作り方を 説明します。

[1] aaa()実行でダイアログを表示
[2] 「検索」ボタンクリックでaaa1()実行


---------------------------------------------------------
ポイント1.オ-トフィルタはセルに表示されている形式と合わないと抽出できません。 したがって下記のように入力したデータをセル表示に合わせる。

UserForm1.TextBox1.Text = Format(UserForm1.TextBox1.Text, "m""月""d""日""")
---------------------------------------------------------
ポイント2.下記セルの表示が[1][2][3]は問題なし。[4][5][6]は手で「データ」「フィルタ」 「オートフィルタ」で行なった場合は問題ないが、何故かマクロでは抽出できない、 何故ダメなのか判らないがExcel95の時からずーと同じです。Excel2000で改善されること を期待したいたがダメだった。しょうがないので[3]の年2桁で行なって下さい、 もしそれも問題がある場合は再度メールを下さい

[1]Format(UserForm1.TextBox1.Text, "m""月""d""日""") セル表示:1月2日 可
[2]Format(UserForm1.TextBox1.Text, "m/d")      セル表示:1/2 可
[3]Format(UserForm1.TextBox1.Text, "yy/m/d")    セル表示:01/1/2 可

[4]Format(UserForm1.TextBox1.Text, "ge.m.d") セル表示:H13.1.2 不可
[5]Format(UserForm1.TextBox1.Text, "yy/m/d") セル表示:2001/1/2 不可
[6]Format(UserForm1.TextBox1.Text, "ggge""年""m""月""d""日""")セル表示:平成13年1月2日 不可


Sub aaa()
UserForm1.Show
End Sub

Sub aaa1()
dat = ""

UserForm1.TextBox1.Text = Format(UserForm1.TextBox1.Text, "m""月""d""日""")

hizuke = UserForm1.TextBox1.Text
meigara = UserForm1.TextBox2.Text
'フィルタ
Range("A3").Select
Selection.AutoFilter
    Selection.AutoFilter Field:=2, Criteria1:=hizuke, Operator:=xlAnd
    Selection.AutoFilter Field:=3, Criteria1:=meigara, Operator:=xlAnd
    
'C列データ取得
  Range("a4").CurrentRegion.SpecialCells(xlVisible).Select
   For Each sel In Selection
        r = sel.Row
        If r <> 2 Then
            dat = Cells(r, 4)
            Exit For
        End If
   Next sel
If dat = "" Then
   dat = "抽出条件のデータなし"
End If
UserForm1.Label1.Caption = dat
Range("A2").Select
'フィルタ戻す
Selection.AutoFilter
End Sub
------------------------------------------------------------
上記で質問への返事は終わりですが、どうしても年を4桁で抽出したい場合 は下記の方法があります。本例は抽出した行をメッセージボックスへ表示する だけですが、配列へ入れ後からその行のみ処理すればフィルタで抽出したのと 同じことが出来ます。(フィルタ処理に比べ時間が掛かる)

Dim meigara As Date
Sub Macro1()
  ActiveCell.SpecialCells(xlLastCell).Select
  endr = ActiveCell.Row
  Range(Cells(2, 2), Cells(endr, 2)).Select
  
  hizuke = UserForm1.TextBox1.Text
  
  For Each sel In Selection
        If sel.Value = hizuke Then
            sel.Select
            selr = ActiveCell.Row
            MsgBox "対象のセルは「" & selr & "「にあります"
        End If
    Next sel
Range("A1").Select
End Sub

4.[2弾-他2]入力した数値をカンマ付きへ変換

[2001/02/23 M.Tさんからの質問(上記と同じ方ですが質問内容が異なるので項目を分けた)]
ついでにもう1点、データベースの数値が111,222とコンマ がついている場合、入力もコンマ付きでないと検索できません。 111222といれた数値を111,222と変換する魔法をお教え下さい。 誠に初歩的な質問で申し訳ありませんが、お願い申し上げます。

魔法でも何でもないが、下記[1]でOKのはずです。なお、昔作った サンプルがあったのでついでに掲載したが[2]でもいいと思います。

[1].Formatでカンマを付ける
UserForm1.TextBox1.Text = Format(UserForm1.TextBox1.Text, "#,###")
kanma = UserForm1.TextBox1.Text

[2].桁数をチェックしカンマを付ける
kanma = UserForm1.TextBox1.Text
    aas = Len(kanma)
    If aas > 6 Then
            s1 = Right(kanma, 3)
            s2 = Mid(kanma, 1, aas - 3)
            s2 = Right(s2, 3)
            s3 = Mid(kanma, 1, aas - 6)
            kanma = s3 & "," & s2 & "," & s1
    ElseIf aas > 3 Then
            s1 = Right(kanma, 3)
            s2 = Mid(kanma, 1, aas - 3)
         kanma = s2 & "," & s1
    End If

5.[2弾-他3]コマンドボタンについて

[2001/03/09 U.Cさんからの質問]
ExcelVBAマクロ500連発第2弾各パーツについている「実行ボタン」について、 おせわになります各パーツを実行するための「実行」ボタン、右クリックしてもプロパテイと コードの表示がでません どのようにしたらよいでしょうか ちなみに隣に自分でコマンドボタンを作成したものは表示されます パソコンへは、「XLSINST.exe」でインストールしました この本の内容をぜひとも理解したいと思い読んでおります。
上図の左図はメニューの[表示][ツールバー][フォーム]で描いたものです。
右図はメニューの[表示][ツールバー][コントロールツールボックス]で描いたもの。

※ ワ−クシ−トにコマンドボタンを表示しそれをクリックしてマクロを実行させる事が よくあるが、15.5KBのExcelファイルにActiveXコントロ−ル(上図の右図)の コマンドボタンを貼り付けクリックイベントで実行する場合は25.5KBの容量になった。 それに比べフォ−ム(OLEカスタムコントロ−ル:上図の左図)のコマンドボタンを 使用した場合は16.0KBで 0.5KB増えただけである。単純にあるマクロを実行させる だけであれば、私の場合フォ−ム(上図の左図)のコマンドボタンを使用している。

質問と回答が合っているかどうか不明ですが返事は以上です。

6.[2弾-157]オートフィルタで複合条件で抽出する

[2001/05/18 T.Tさんからの質問]
EXCEL VBAマクロ500連発 第2弾はとても参考になり、日常業務の役立 てさせていただいております。 その本のなかでNo.157について質問します。

オートフィルターでテキストボックスを使用して、抽出しているVBAですが、 あいまい検索できますが、「*」を入力することを省けないででしょうか? 実際に使用する人はあまりパソコンにも詳しくないので、「*」をつけることができ ないようです。 オートフィルターのオプションでは〜を含むという形式でできるのですが、テキスト ボックスを使って、VBAで「*」をつけることなく抽出することができるでしょう か? 使用する人に対して、「*」の意味を教えることは必要かとは思いますが、 VBAで、操作の負担の少なくさせたいと思いますので宜しくお願いします。


下記のように、検索文字の後ろに"*"を追加すればOKのはずです。

'あいまい検索
    dat1 = dat1 & "*"
    dat2 = dat2 & "*"
    dat = dat & "*"
'デ−タ検索
      Application.Worksheets(sname).Activate
      Range("a1").Select
      ------(略)

上記で問題がある場合は再度メールを下さい。

7.[2弾-10]マクロの使用期限を設定する

[2001/08/19 M.Tさんからの質問]
マクロ番号10番「マクロの使用期限を設定する」ActiveSheet.Protect UserInterfaceOnly:=True  のマクロを1ヵ月間の使用期限に設定するマクロの書き方を教えてください。

下記のdate1+10 を date1+30 に変更すれば先30日の日付けが設定されます。
なお、実際は月により、28日・30日・31日と変わる為厳密には30日が一ヶ月と
言い切れませんが、一般的には30日を指定で問題ないと思います。

If Cells(50, 1) = "" Then
	Rows("50:50").RowHeight = 0
        Cells(50, 1) = date1 + 10
        ActiveSheet.Protect password:="0000"
        ActiveWorkbook.Save
        date2 = date1 + 10
        MsgBox "有効期限「" & date2 & "」となっています"
        kigen = 1
Else

8.[2弾-他4]Excel95 VBAマクロサポートのお願い

[2001/10/17 M.Gさんからの質問]
初めまして、HP-Name Goomと申します。 500連発 1・2号を購入させて頂きました。 Excel95 VBAに関して、マクロサポートをお願いしたく メールをさせて頂きました。

A列に日付を入力し、B列に曜日をマクロにて入力したいのですが、 良い方法があれば、教えていただけないでしょうか??? お忙しいところ、恐縮でございますが、よろしくお願い致します


下記例では、セル"A1"に2001/10/17が入っている場合セル"B1は、
Macro1 → 水曜日
Macro2 → 水曜日
Macro3 → 水
と表示されます。

Sub Macro1()
Dim week As Variant
week = Array("日", "月", "火", "水", "木", "金", "土")
    If IsDate(Cells(1, 1)) Then
        hi = CDate(Cells(1, 1))
        w = Weekday(hi)
        Cells(1, 2) = week(w - 1) & "曜日"
    End If
End Sub

Sub Macro2()
    hi = CDate(Cells(1, 1))
    Cells(1, 2) = Format(hi, "aaaa")
End Sub

Sub Macro3()
    hi = CDate(Cells(1, 1))
    Cells(1, 2) = Format(hi, "aaa")
End Sub

追記:
私がサポートするのは自分が掲載したサンプルマクロであって、
VBA全般の質問に対して回答すると言う意味ではありません。
誤解のないようお願いします。
次回質問の場合は掲載の番号付きでお願いします。

9.[2弾-157]インプットボックスをファイルを開くと同時に自動的に開く

[2001/12/13 T.Tさんからの質問]
いつもお世話になります。 EXCEL VBAマクロ500連発 第2弾No.157について質問します。 インプットボックスはファイルを開くと同時に自動的に開くことができないでしょうか?
必ず入力するので、コマンドボタンをクリックする作業の省力化を計りたいのです。 outo opunでもうまく開きません。 宜しくお願いします。

下記マクロを作成し、自分のPC(Excel2000)で実行しましたが インプットボックスは表示され問題ありません。 下記サンプルで実行出来ない場合、Excelのバージョンを 教えて下さい。

例1、例2のWorkbook_Open()はThisWorkbookをクリックして記述
例2のMacro1()、例3AUTO_OPEN()は標準モジュールへ記述

---------例1-------------------
Private Sub Workbook_Open()
mozi = Application.InputBox(msg, "題名", Type:=2)
End Sub

---------例2-------------------

Private Sub Workbook_Open()
Macro2
End Sub
Sub Macro1()
mozi = Application.InputBox(msg, "題名", Type:=2)
End Sub

---------例3-------------------
Sub AUTO_OPEN()
mozi = Application.InputBox(msg, "題名", Type:=2)
End Sub
早速の返事ありがとうございました。 自動オープンできました。 いつも返事をいただいたときは、さぁ〜と 視界が広がり、雲が抜けたようなさわやかな気分になり すっきりします。 本当にありがとうございまいした。 今後とも宜しくお願いします。
10.[2弾-143]連続した日付表を作成する

[2001/12/28 P.Hさんからの質問]
 実はExcelVBAマクロ500連発第2弾を買った のですが、ちょっと分からない所があったので、メール をさせて頂きました。
 それは143の「連続した日付表を作成する」なんですが、 どうしてセルに日付を挿入してシートを見てみると、最後の三日間 だけ曜日が入ってないのですか?最後の3日にも曜日を入れたい時は どうしたらいいですか?  作成する日付数、作成行、スタート列の変更はわかりました。 ちなみに私は、作成行を2行で作成したいのです。

チェックしたところマクロにミスがありました。 大変申し訳ありませんでした。下記(正)のマクロに訂正願います。
--------------- 誤 -------------------
'月/日記入。
    For i = 1 To hisu

'曜日記入
    Range(Cells(2, cm), Cells(2, hisu)).Select

'日曜日色づけ
For i = cm To hisu

--------------- 正 -------------------
'月/日記入。
    For i = 1 To hisu - 1
  
'曜日記入
    Range(Cells(2, cm), Cells(2, hisu + cm)).Select

'日曜日色づけ
For i = cm To hisu + cm

【戻る】