すぐマク Excel VBA Board

33717
Excel VBA FAQ 掲示板
画像クリックで拡大。レスのついた質問は削除しない。回答には返礼を!
お名前
件名
メッセージ
画像
メールアドレス
ホームページ
文字色
編集/削除キー (半角英数字のみで4〜8文字)
プレビューする (投稿前に、内容をプレビューして確認できます)

キーワードで抽出した結果をリストボックスへ表示したい - MN

2009/10/07 (Wed) 20:57:55

500連発第2弾の396を利用し、必要なデータ(3列 コードと会社名と部署名)をリストボックス上に表示し、1件のみ・選択した複数データ・選択した連続データの抽出が出来、VBAが完成しました。ところが、使用者側から、リストボックスの内容をキーワードで検索し、抽出できないか?
例 「東京」キーワードを入力して、会社名と部署名に「東京」というキーワードがあったら、リストボックス表示を再表示して、選択し抽出する。
先生のHP上でもこのような例がなく、シート上にあるキーワードと一致しする検索照会は出来るのを確認できましたが、リストボックスに表示した内容をキーワードで検索できないものでしょうか?

Re: キーワードで抽出した結果をリストボックスへ表示したい - 永井善王 Home

2009/10/08 (Thu) 07:21:30

500連発第2弾396番をマスターできてよかったですね。
ところで、
Q1. 「東京」キーワードはどこへ入力するのですか、テキストボックスですか?
Q2. 「シート上にあるキーワードと一致する検索」とありますが、オートフィルタで抽出ですね?
Q3. オートフィルタでの抽出結果を別のシートへコピー貼り付けできますね?
以上により、貼り付けたシートからリストボックスへ表示すれば完成すると思いますよ。
トライしてみて分からない点が出たら、再質問されることをお勧めします。

Re: キーワードで抽出した結果をリストボックスへ表示したい - MN Home

2009/10/08 (Thu) 17:34:14

早速の回答ありがとう御座いました。言葉使いが誤っていました。キーワードと一致と言いましたが、そのキーワードを含むでした。500連発第2弾396番では、オプションボタンで抽出条件を分けていますので、4個目にオプションボタン・テキストボックス・コマンドボタンを各1個追加します。4個目のオプションボタンを選択し、テキストボックスにキーワードを入力し、コマンドボタンを押す。(画像見本参照)すると、キーワードに一致したデータがリストボックスに再表示され、その中から、必要なデータを選択する。
Q1はテキストボックスに入力します。
Q2はオートフィルタでは無く、一般的な検索です。指定したキーワードが含まれていれば良い
Q3画像見本では、キーワードを「東京」を入力した場合、会社名(2列目)にある東京と部署名(3列目)にある東京のデータのみ再表示する。
オートフィルタだとキーワードの指定が出来ないので。返答を記述中に、今回の4番目の抽出は、396番の方式と切り離した方が良いかな?。データの選択を同じ画面で出来る方がベターですが、処理が
複雑になりそうで、それならば、分離して処理した方が良いと思いました。勉強になりありがとうございました。

よかったですね - 永井善王 Home

2009/10/08 (Thu) 17:41:27

自己解決されたようで、よかったですね。 では、これで失礼します。

メモリー不足となってしまいます まな

2009/10/06 (Tue) 15:09:43

お世話になります
ちまちまとマクロを勉強しながらやっていますがマクロを実行するとメモリー不足となってしまいました 解除方法があったら教えてください。

ファイルはxlsm形式で保存
オプションボタンでチェックした項目をセルに入力しています。

Private Sub OptionButton1_Click()
ActiveCell.FormulaR1C1 = "m"
End Sub

Private Sub OptionButton2_Click()
ActiveCell.FormulaR1C1 = "?"
End Sub

Private Sub OptionButton3_Click()
ActiveCell.FormulaR1C1 = "m3"
End Sub

Private Sub OptionButton4_Click()
ActiveCell.FormulaR1C1 = "枚"
End Sub

Private Sub OptionButton5_Click()
ActiveCell.FormulaR1C1 = "回"
End Sub

Private Sub OptionButton6_Click()
ActiveCell.FormulaR1C1 = "箇所"
End Sub

Private Sub OptionButton7_Click()
ActiveCell.FormulaR1C1 = "本"
End Sub

Private Sub OptionButton8_Click()
ActiveCell.FormulaR1C1 = "袋"
End Sub

Private Sub OptionButton9_Click()
ActiveCell.FormulaR1C1 = "t"
End Sub

Private Sub OptionButton10_Click()
ActiveCell.FormulaR1C1 = "?"
End Sub

Private Sub OptionButton11_Click()
ActiveCell.FormulaR1C1 = "個"
End Sub

Private Sub OptionButton12_Click()
ActiveCell.FormulaR1C1 = "台"
End Sub

Private Sub OptionButton13_Click()
ActiveCell.FormulaR1C1 = "式"
End Sub

Private Sub OptionButton14_Click()
ActiveCell.FormulaR1C1 = "〃"
End Sub

実行するとセルに値は入るのですがメモリー不足ですとなってしまいます。
解決方法をお願いします。

Re: メモリー不足となってしまいます - 永井善王 Home

2009/10/06 (Tue) 17:31:10

メモリ不足になるのは、マクロのどの行ですか?

Re: メモリー不足となってしまいます まな

2009/10/07 (Wed) 15:01:23

すべてユーザーフォームから入力すると出てしまいます。
マクロの記述がおかしいのですか?

Re: メモリー不足となってしまいます - 永井善王 Home

2009/10/07 (Wed) 19:55:08

「すべてユーザーフォームから入力すると出てしまいます。」ということであるなら、たとえばオブションボタン1をクリックしたときにアクティブセルが「m」にならないでメモリ不足になってしまうということですね。
どんなブックのどんなシートで、どんなマクロか、全容を示された方が解決に近付けると思いますよ。

ありがとうございました まな

2009/10/08 (Thu) 14:45:28

いろいろと試してみたらなぜかメモリー不足が出なくなりました。
どこが悪かったのかは理解できてないですが何とかなりました ありがとうございます。

次のworkdayの日にちに置き換えるvba - ゆき

2009/09/04 (Fri) 10:55:30

ある日付がworkdayかどうか見極め、土日祝日であれば、次のworkdayの日にちに置き換えるvbaを知りたいです。
Excel2000を使っています。よろしくおねがいします。

workdayとは? - 永井善王 Home

2009/09/04 (Fri) 11:14:14

「workday」 とは、一般的には 「仕事日、 就業日、 平日」のこと (プログレッシブ英和中辞典) のようですが、あなたの定義はこれとは違うのですか?
「ある日付がworkdayかどうか見極め」とありますが、日本語で言うとどうなりますか。
もしかして、WORKDAY関数を知ってみえて、それをVBAで使う方法を尋ねてみえるのですか?

Re: 次のworkdayの日にちに置き換えるvba - ゆき

2009/09/04 (Fri) 12:57:42

お返事ありがとうございます。
分かりずらい質問ですみません。

あるデータの中に2009.9.22という日付があったら、この日は日本の休日になるので、翌平日である2009.9.24に置き換える。というVBAを教えていただきたく質問しました。
よろしくお願いいたします。

Re: 次のworkdayの日にちに置き換えるvba - 永井善王 Home

2009/09/04 (Fri) 18:31:16

WORKDAY関数は、指定した日付から土曜、日曜を除いた日数分あとの日付を求めることができます。(祝日の調整も可能)
しかし、この関数を利用するにはアドインの「分析ツール」を設定しなければなりません。詳細は下記ページを参照されるとよいと思います。
・WORKDAY関数の使い方(指定した稼働日数後の日付を求める関数) http://maglog.jp/excel/Article274171.html
・EXCEL VBAでWORKDAY関数を使用したい http://oshiete1.goo.ne.jp/qa1810554.html
頑張ってください。

Re: 次のworkdayの日にちに置き換えるvba - ゆき

2009/09/08 (Tue) 11:11:29

サイトの添付、どうもありがとうございました。
チャレンジしてみます。
また分からなかったら質問すると思いますが、その際はよろしくおねがいします。
まずはお礼まで。

ありがとうございました - ゆき

2009/09/29 (Tue) 11:26:17

お返事遅くなりすみません。
添付していただいたサイトを参考にし、VBA作成できました。
どうもありがとうございました!

株価自動記録 loswel2

2009/09/27 (Sun) 00:26:02

こんにちはVBA初心者ですが、株価を一分毎に
WEBクエリーで取得しシートに貼り付け、さらに一時間毎に四本値をエクセルで自動作成するマクロを組みたいのですが、一分毎の貼り付けは問題なく動きますが、60回カウント後、一時間毎の処理をするGoSUBへどうしてもうまく飛んでいってくれません。
どこが悪いのでしょうか、どなたかご教授願えないでしょうか。よろしくお願いします。


Sub 自動記録1()
Dim counter

Application.OnTime Now + TimeValue("00:01:00"), "自動記録1" '一分毎に自動記録1を実行


If counter >= 60 Then GoSub time1 Else: counter = counter + 1

Worksheets("一分値").Activate '一分値をアクティブにする ※1
Range("b3:d61").Copy 'コピーする ※2
Range("b2").Select '貼り付け先のセル範囲を選択する ※3
ActiveSheet.Paste '現在の選択範囲に貼り付ける


Range("b64:c64").Copy 'コピーする ※2
Range("b61").Select '貼り付け先のセル範囲を選択する ※3
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone



Exit Sub

time1:
                '一時間毎に時間値をコピーする

Worksheets("一時間値").Activate '一時間値をアクティブにする ※1
Range("b3:f61").Copy 'コピーする ※2
Range("b2").Select '貼り付け先のセル範囲を選択する ※3
ActiveSheet.Paste '現在の選択範囲に貼り付ける


Range("b65:f65").Copy 'コピーする ※2
Range("b61").Select '貼り付け先のセル範囲を選択する ※3
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone

counter = 0

Worksheets("一分値").Activate '一分値をアクティブにする

Return

End Sub

Re: 株価自動記録 - 永井善王 Home

2009/09/27 (Sun) 07:47:53

詳しくは見てありませんが、下記2カ所を修正すると、どうなりますか。

・ 2行目の Dim counter を削除するか、Sub 自動記録1() の行よりも上の行に変更する
・ 4行目の If counter >= 60 Then GoSub time1 Else: counter = counter + 1 を
  If counter >= 60 Then GoSub time1 Else counter = counter + 1 に変更する
  (コロンを削除する)

ありがとうございました loswel2

2009/09/27 (Sun) 13:00:12

ご指摘の2点を修正したら見事に飛んでいってくれました!
感謝感謝!!ありがとうございました!
まだまだVBA初心者ですが今後ともよろしくお願いいたします。

VBA自動実行 - ミルトン

2009/08/16 (Sun) 17:59:42

はじめまして。
ホームページに似たような質問があったのですが、応用が出来ずに困っています。
このページの質問です。(http://www.asahi-net.or.jp/~ZN3Y-NGI/YNxv9c7.html)

このページの質問は特定のセルに特定の値が入力されたときだと思うのですが、
特定のセルに何らかの値が入力された時、プロシージャを実行するにはどうしたらよいのでしょうか。

さらに私がやりたいのは、
セルA1に入力ーーーー>プロシージャAを実行
セルB2に入力ーーーー>プロシージャBを実行
       ・
       ・
       ・
のようにしたいのです。

お手数ですが回答よろしくお願いします。

Re: VBA自動実行 - 永井善王 Home

2009/08/16 (Sun) 18:29:59

ご自分でどこまで出来たのかを示された方が良いと思います。
でないと丸投げ質問になってしまいますよ。

Re: VBA自動実行 - ミルトン

2009/08/16 (Sun) 19:08:15

失礼いたしました。とりあえず作ってみたのですが

Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Column = 3 And Target.Row = 51 Then
   EXC1
   End If

   If Target.Column = 3 And Target.Row = 59 Then
   EXC12
   End If
   ・
   ・(あとは上記と同じような感じです。)
   ・
End Sub
と作りました。

指定しているセルに値を入力しても何の変化も起きませんでした。

Re: VBA自動実行 - 永井善王 Home

2009/08/17 (Mon) 07:25:29

提示されたマクロはワークシートのコード画面に作成してありますね。 新しいブックに下記マクロを作成して、C51セルとC59セルで試すと、どうなりますか?
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 3 And Target.Row = 51 Then
MsgBox Target.Address
End If
If Target.Column = 3 And Target.Row = 59 Then
MsgBox Target.Address
End If
End Sub

ありがとうございました - ミルトン

2009/08/17 (Mon) 18:40:34

$C$51、$C$51と出ます!
ですが、AY3セルの変化で自動実行させたかったので、ColumnとRowが逆だったということですね・・・。
単純なミスで質問してしまい申し訳ありません。

逆にすると自動実行できました。
ありがとうございました。

テキスト書き出し - 鶏肋

2009/08/11 (Tue) 17:21:05

こんにちは。
現在、Excelの各シートのテキストボックス内の文字を書き出し、一覧表にするマクロを作っているのですが、行き詰ってしまったのでご教示お願いいたします。

マクロでは、一番最後にシートを一枚プラスし、そこに各シートのテキストボックス内の文字を書き出しています。(初心者なので構文に無駄が多いかもしれませんが)。

問題なのですが、たとえば以下のようなパターンがあるとします。
?シート1に「報告書」と書かれたテキストボックスが1つある。
?シート1に「報告書」と書かれたテキストボックスが1つと、オートシェイプの矢印が1つある。
?シート1に「報告書」と書かれたテキストボックスが2つと、オートシェイプの矢印が1つある。

?の場合は、一覧にちゃんと「報告書」と書き出されるので問題ありません。
問題は??で、?の場合、一覧には「報告書」と2度書き出されてしまいます。
これを1度にしたいのです。
書き出した後、重複する文字を削除する方法も考えましたが、それでは?に対応できません。
(現時点のマクロでは、?の場合、「報告書」という文字が3回書き出されます。これを2回にしたいです)。

基本的なことかもしれませんが、よくわからないので、よろしくお願いいたします。

私が書いたマクロは以下のとおりです。

Sub TextFrameExport()

Application.ScreenUpdating = False

Worksheets.Add after:=Worksheets(Sheets.Count)

Dim myShname As String
Dim i As Integer
Dim myCount As Integer

myCount = Worksheets.Count - 1


Select Case myCount

Case Is = 1

Worksheets(Sheets.Count).Select
Range("A1").Value = Worksheets(1).Name

Dim myRng As Range
Dim myCell As Range
Dim wsName As String
Dim myShape As Shape
Dim myTxt As String
Dim j As Long

Worksheets(Sheets.Count).Range("A1").Select
Set myRng = Worksheets(Sheets.Count).Range("A1")
For Each myCell In myRng
wsName = myCell.Value
For Each myShape In Worksheets(wsName).Shapes
On Error Resume Next
myTxt = myShape.TextFrame.Characters.Text
On Error GoTo 0

If myTxt <> Empty Then
j = j + 1
myCell.Offset(0, j).Value = myTxt
End If
Next
myTxt = ""
j = 0
Next


Case Else

For i = 1 To myCount
Worksheets(Sheets.Count).Select
Range("A1").Offset(i - 1, 0).Value = Worksheets(i).Name
i = i
Next


Worksheets(Sheets.Count).Range("A1").Select
Set myRng = Worksheets(Sheets.Count).Range(Selection, Selection.End(xlDown))
For Each myCell In myRng
wsName = myCell.Value
For Each myShape In Worksheets(wsName).Shapes
On Error Resume Next
myTxt = myShape.TextFrame.Characters.Text
On Error GoTo 0

If myTxt <> Empty Then
j = j + 1
myCell.Offset(0, j).Value = myTxt
End If
Next
myTxt = ""
j = 0
Next

End Select

Application.ScreenUpdating = True

End Sub

Re: テキスト書き出し - 永井善王 Home

2009/08/12 (Wed) 08:13:54

マクロの下から15行目に For Each myShape In Worksheets(wsName).Shapes があります。
その次へ下記コードを挿入し、図形の種類か名前を判別するようにすれば解決するのではないでしょうか。
If myShape.Type <> msoTextBox Then Exit For または
If Left(myShape.Name, 8) <> "Text Box" Then Exit For
参考ページ … http://www.asahi-net.or.jp/~zn3y-ngi/YNxv212.html#2-1
・指定した種類の図形を削除する
・すべての図形からテキストボックスを見つける

ありがとうございました - 鶏肋

2009/08/13 (Thu) 09:29:13

永井善王様いつもお世話になります。
業務関係上、ご教示いただいたうち、今回は図形の種類を指定する方法を使わせていただきました。
矢印のオートシェイプなどに関わらず、無事にテキストボックスの文字だけ書き出すことができました。
ありがとうございました。

すいません。教えて下さい - アンラッキー7

2009/08/12 (Wed) 21:00:10

初めまして。勉強し始めたばかりの者です。

メッセージボックスの選択結果により指定した行
へ文字列を貼り付けるマクロいうのは可能ですか?
知ってましたら御教示願いませんか?


Re: すいません。教えて下さい - 永井善王 Home

2009/08/13 (Thu) 07:55:33

あなたの頭の中にあるメッセージボックスがどんなものか分かりませんが、可能だと思いますよ。
たとえば、イエスノーのメッセージボックスなら下記マクロのようになります。

応答 = MsgBox("選択してください。", vbYesNo)
If 応答 = vbYes Then '[はい]がクリックされたら
MsgBox "[はい] がクリックされました"
Else 'そうでなければ
MsgBox "[いいえ] がクリックされました"
End If

「指定した行(のセル)へ文字列の貼り付け」とありますが、たとえばA1セルに"○だよ"という文字列を表示したいようなことならば、「貼り付け」でなくて代入すればいいですから、コードは下記のようになります。
Range("A1").Value = "○だよ"

これらを組み合わせたうえで分からないことが出たら、再質問なさるといいと思います。ガンバ!

フィルタをかけた状態でのコピー - がんのじ

2009/08/10 (Mon) 17:37:23

こんにちは。
いつもHPで、勉強させて頂いてます。ありがとうございます。
まだまだ、勉強中の身です。。。

何か、アドバイス頂ければと思い、書き込みしました。どうか宜しくお願いします。

あるデータを作成するのに辺り、Excelで書き出した表を使用しています。
ある条件で、フィルタをかけて、アクティブになっている行だけに対し、"A"という数式をコピーをし、それを行全体にコピーしたいと思い、作成してみたのですが、、、うまくいきません。
何か良い方法があれば、教えて下さい。。。

===========
◆コード◆
===========

Sub test()

Selection.AutoFilter Field:=2, Criteria1:="○"

Range("I1").Select    
Selection.Copy

Range("C1").Offset(1, 0).Select
ActiveSheet.Paste

Range("C1").Offset(1, 0).Select
上 = 2
左 = 3
下 = Range(Cells(上, 左 - 1), Cells(上, 左 - 1)).End(xlDown).Row

Selection.AutoFill Destination:=Range(Cells(上, 左), Cells(下, 左)), Type:=xlFillDefault
Range(Cells(上, 左), Cells(下, 左)).Select

End Sub

===========

フィルタをかけない状態であれば、すべての行のC列に"I1"の関数が入力されるのですが・・・。(データのある行数分)

なんとかフィルタで見えている行だけに、コピー(貼り付け)を行いたいのです。
皆さん、ご教授のほど、宜しくお願いします。

参考情報です - 永井善王 Home

2009/08/11 (Tue) 08:22:11

オートフィルタで抽出したデータの最上行と最下行の行番号がわかれば何とかなるようですね。
あなたのマクロの5行目のセル範囲選択のコードを下記マクロを活用して改良し、同じく6?9行目を削除してみてください。

Sub オートフィルターで抽出したデータの最上行と最下行の行番号を取得する()
With ActiveSheet
.Range("A1").AutoFilter field:=2, Criteria1:="○"
With .UsedRange '使われたセル範囲
On Error Resume Next
データの最上行 = .Resize(.Rows.Count - 1).Offset(1) _
.SpecialCells(xlCellTypeVisible).Row '行番号
データの最下行 = .SpecialCells(xlCellTypeLastCell).Row
On Error GoTo 0
End With
End With
MsgBox "データの最上行 … " & データの最上行 & "、最下行 … " & データの最下行
End Sub

このマクロは拙著「Excel VBA マクロ組み方講座 プロの定番・裏技・合わせ技[編]」
http://www.asahi-net.or.jp/~zn3y-ngi/YNaz100_Kumi-2.html
第3章2-3「希望のデータをオートフィルタで抽出したい」に掲載されたマクロを参考にして作りました。
ご成功を祈ります。

ありがとうございます!! - がんのじ

2009/08/11 (Tue) 13:18:30

早速のお返事ありがとうございます。
教えて頂いたコードと、もう一度HPなどで確認し、新たに作成してみました。

始めは、なかなか思ったようにいきませんでしたが、上記のコードを元に、実際に動かしてみたりなどで、施行錯誤を繰り返して、なんとか理想どおりのコードが出来ました。
ホントにありがとうございます!

また何かあれば、相談させてください!

コンボボックス1文字検索について - えーすけ

2009/08/06 (Thu) 17:38:44

こんにちは。
いつもこちらのHPを参考にさせて頂き助かっております。

不動産管理会社に勤めているものなのですが、書類作成で皆様のお力をお貸しください。お願いします。

http://www.asahi-net.or.jp/~zn3y-ngi/YNxv98314.html を参考にさせて頂いておおよそ希望するものが出来上がったのですが、1つ困り事が・・・

建物の物件名を検索させるように作ったのですが最初の1文字目がカタカナ・アルファベット・漢字がバラバラの為やり方が分からず困ってしまいました。
全ての物件名にヨミガナとしてカタカナを入力した行を作りそれを参照し(ヨミガナではない)、入力候補を表示させる方法をお教えください。

アルファベットの物件名は人によってはカタカナで入力する為、お知恵をお貸し下さい。お願いします。

Re: コンボボックス1文字検索について - 永井善王 Home

2009/08/09 (Sun) 10:04:18

「コンボボックスで1文字目一致で入力候補を表示するには?」が参考になったようで嬉しいです。
「ヨミガナ」を頭文字と解釈した場合のサンプルを作っておきました。
あまり時間が取れないのでパーフェクトなものではありませんが、タタキ台になれば幸いです。 右図をクリックで拡大し、それを見ながら以下の説明を読んでください。

1. 上記ページからダウンロードした「YNxv98314_ComboBox.xls」の「名簿」シートと「UserForm1」を右図のように改良する
2. 同じくUserForm1のコードを右図のものに差し替える(下記コードならコピペ可能)
3. 「SSS」シートにあるボタン[1文字目一致で入力候補を表示するには]をクリックする
4. 右図の「一部改良後の「UserForm1」」が表示されたら、「い」と入力する
5. 右図の「入力中の「UserForm1」」のようにドロップダウン矢印(▼)をクリックして、表示されたドロップダウンリストから「Iina館」でもクリックしてみる
6. するとメッセージボックスに選択された物件名が表示される

以下はコピペ用のコードです。(Tabが無効)
'=========================================================================================
' FAQ コンボボックスで頭文字一致で入力候補を表示するには
'=========================================================================================
Option Explicit
Dim リスト配列() As Variant 'コンボボックスのリスト用の動的配列変数
Dim 名簿件数, 行
'--------------------------------------------------------------------------------------
Private Sub UserForm_Initialize()
名簿件数 = 11
ReDim リスト配列(名簿件数, 1) '動的配列変数にメモリ領域の再割り当て
For 行 = 1 To 名簿件数
リスト配列(行 - 1, 0) = Worksheets("名簿").Cells(行 + 1, 1).Value '名簿シートのA列
リスト配列(行 - 1, 1) = Worksheets("名簿").Cells(行 + 1, 2).Value '同B列
Next
With ComboBox1 'コンボボックスについて
.ColumnCount = 2 '表示列数の設定
.TextColumn = 1 '表示列の設定
.List() = リスト配列() 'リストを設定
.MatchEntry = fmMatchEntryFirstLetter '入力した文字と1文字目が一致する候補を検索
End With
End Sub
'--------------------------------------------------------------------------------------
Private Sub ComboBox1_Change()
If ComboBox1.ListIndex = -1 Then
MsgBox "みつかりません。", vbExclamation
Exit Sub
End If
Label2.Caption = リスト配列(ComboBox1.ListIndex, 1) '候補を表示する
End Sub
'--------------------------------------------------------------------------------------
Private Sub CommandButton1_Click()
If ComboBox1.MatchFound Then '一致する項目がリストの中にあれば
MsgBox Label2.Caption '選択結果を取り出す
Else
MsgBox "中止します。", vbExclamation
End If
Unload Me 'ユーザーフォームを閉じる
End Sub
'=========================================================================================
' すぐに役立つエクセルVBAマクロ集 Copyright(c)2009 Yoshioh Nagai
'=========================================================================================

成功を祈ります。

有難う御座いました - えーすけ

2009/08/10 (Mon) 18:39:21

ありがとうございました?。

1から10まで聞いていては失礼だし自分の為にならないと思い、いろいろエラー・コード変更で悩みつつも何とか完成できました。
また勉強していき解らない"壁"にぶつかったらご教授願います。
誠に有難う御座いました。。。

xp 2003とvista 2007の処理能力の違いについて - 花火

2009/08/03 (Mon) 21:49:58

こんばんは。
いつも本当にお世話になっています。ありがとうございます。


備品台帳の作成で困っています。
皆さんのお力をお貸しください。


備品をエクセルファイルで管理しています。
項目ごとに備品台帳を作成し別ブックで保存させるVBAをコーディングしています。
必要枚数を計算して、元ファイルにある備品台帳シートを
別ブックにコピーしていくのですが
windows xp Excel2003だと、44枚目のところでエラーが発生してとまってしまいます。
windows Vista Excel2007だと最後までできるので
コードそのものに問題はないと思います。
〔vista 2007でやってみると最終的にシートは82枚でした〕


全く検討ちがいなのかもしれませんが、自分としては
シートの枚数的には余裕があるけど
そこへ至る処理過程でオーバーしてしまうのだろうと思っています。

現在のコードは、ほとんどがユーザーフォームに記載されています。
そのコードを標準モジュールなどに分散させると大丈夫なのでしょうか?

どうぞ教えてください。

よろしくお願いします。

Excelの仕様および制限 - 永井善王 Home

2009/08/04 (Tue) 07:42:37

2003ではシートが44枚以上あると処理できないのかと、Excelの仕様をお尋ねなのですね。
たとしたら、MS社ではExcelの仕様および制限のページ
http://office.microsoft.com/ja-jp/excel/HP051992911041.aspx
で、「ブックのシート数 … 使用可能メモリに依存(既定では3)」 と公表しています。
もしも、この制限に引っ掛かったのであるならば、あなたが使われた「windows xp Excel2003」パソコンのメモリが極端に小さいのに巨大なシートが多いなどの原因があるのでしょうね。

エラーメッセージのくわしい内容と、エラーとなっているコードをきちんと示された方がよろしいかと思います。

Re: xp 2003とvista 2007の処理能力の違いについて - 花火

2009/08/04 (Tue) 22:15:51

永井善王さま、早々のアドバイス、ありがとうございます。


セキュリティの関係上、職場ではこのページに入ることができないので自宅から訪問しています。
今日はファイルを持って帰ってきていないのでコードを表示することができません。
明日、表示します。
アドバイスを求めておきながら、対応が遅くなり、お恥ずかしいかぎりです。
なにとぞ、よろしくお願いします。

Re: xp 2003とvista 2007の処理能力の違いについて - 花火

2009/08/05 (Wed) 23:52:19

こんばんは。
処理の流れとコード、エラーメッセージは下記のとおりです。


備品管理ファイルに
それぞれ大分類・中分類・小分類・備品コードをつけてデータを入力をしています。

ユーザーフォームで、分類を指定してデータを抽出し、
中分類ごとに備品台帳を別ブックに作成していきます。

最初からユーザーフォームで中分類を指定してデータを抽出し備品台帳を作成していくと
データ数が少なくなり作成する備品台帳のシート数が減るため
Windows xp Excel2003でも最後まで動きます。
しかし、大分類で抽出をすると下記コードの44枚目でエラーが発生します。


Hシート位置 = 1
For i = 1 to Hシート総数
Worksheets("備品台帳").Copy before:=Workbooks(新ブック).Worksheets(Hシート位置)
Hシート位置 = Hシート位置 + 1
Next

実行時エラー '1004
worksheetクラスのcopyメゾットが失敗しました。


どうぞ、よろしくお願いします。

メモリの心配はないのですね - 永井善王 Home

2009/08/06 (Thu) 08:30:24

4日の答の前半を無視されてしまいましたね。
シートコピーはどのパソコンでも無限にできると思っていませんか? かなり大きい仕事のようですがメモリの心配はないということですね。
「windows xp Excel2003」パソコンのメモリは十分あるのですね? 「windows Vista Excel2007」パソコンと同一パソコンですか?
コピーされるファイルのサイズは何MBで、For...Nextで新ブックにコピーが済んだ43シートのサイズはどれだけで、44番目のシートのサイズがどれだけとか、検証されましたね?

Re: xp 2003とvista 2007の処理能力の違いについて - 花火

2009/08/08 (Sat) 23:43:02

こんばんは。遅くなってすみません。


永井さま、色々アドバイスをいただいているのに、
説明不足だったり、十分に理解できずにいて本当に申し訳ありません。


ファイルサイズですが、
備品管理をしている元ファイルのサイズは1,509KB
43枚目までできたファイルは380KB
エラーでとまってしまった44枚目のファイルは388KBでした。

実は職場以外のWindowsXp Excel2003の
何台かのパソコンでも試してみたのですが
やはり44枚目でエラーが発生してしまいます。
そのうちの1台でエラーが発生した時の状況は

搭載メモリ 1.0GB
PF使用量  362MB
物理メモリ 合計        1046956KB
      利用可能       574280KB
      システムキャッシュ  713788KB

という状態でした。

ちなみに、最後まで動作するvistaのPCには
職場の備品なので勝手にExcel2003を入れることができず
それでも最後まで動作するのか確認できていません。

メモリの容量について、勉強不足で容量が十分なのかわかりません。
また、アドバイスをいただくのに、この回答でいいのかまだ不足しているのかもわかりません。

大変ご迷惑をおかけしてますが、何卒よろしくお願いします。

メモリが原因でないことをはっきりさせてから ... - 永井善王 Home

2009/08/09 (Sun) 07:58:44

職場のvista PCにExcel2003を入れて試す必要はありませんよ。先に「同一パソコンか」とお尋ねした理由は、主にメモリの大きさと大小関係を知りたかったからです。
ところで、1?43枚目のシートの合計が380KBなのに、44枚目のシートだけで388KB、つまり、44枚目だけが特別大きいということですね。
であるならば、
・44枚目のシートを削除したファイルを作っておいて、それでマクロを実行すると、どうなるか?
・1?43枚目をコピーしたファイル(A)と、44枚目?最後のシートをコピーしたファイル(B)を作っておいて、手作業で、 (A)のファイルの全シートを新規ブックにコピーしてから (B)のファイルにある44枚目に相当するシートをコピーすると、どうなるか?
というように、だんだんと絞り込んでいくのがよいかと思います。


Copyright © 1999- FC2, inc All Rights Reserved.