【無料配信♪】Renta !全タテコミ作品第1話

質問ばかりでもうしわけないのですが
タイトルにあるようにコピーの状況を
プログレスバーで表示できたらなと思い作成したのですが
うまく動きません。
プログレスバー自身単独では動くのですがコピーと合わせると
フリーズしてしまいます。
プログラミング経験と発想力が乏しいのでご教授いただけたら幸いです

Private Sub Bt_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bt_1.Click

Dim fname1 As String = "C:\フォルダ名A"
Dim fname2 As String = "C:\フォルダ名B"
Dim ber1 As Integer

If IO.Directory.Exists(fname1) = True Then
Me.Lb_1.Text = "テキスト文字"

For ber1 = 0 To 20
Me.ProgressBar1.Value = ber1

System.IO.File.Copy("コピー元テキストファイルA", "コピー先テキストファイルA", True)
My.Computer.FileSystem.CopyDirectory("コピー元フォルダA", "コピー先フォルダA", True)
My.Computer.FileSystem.CopyDirectory("コピー元フォルダB", "コピー先フォルダB", True)
Next ber1

If IO.Directory.Exists(fname2) = True Then
System.IO.File.Copy("コピー元ファイルB", "コピー先ファイルB", True)
End If

MessageBox.Show("終了報告テキスト", "タブ名")
' System.IO.Directory.Delete("コピー元", True)
Me.ProgressBar1.Value = 0
Application.Exit()

こんな感じで作成しております。
ファイル自身が1GBぐらいあるので
フリーズしていないかプログレスバーや%表示でしらせたいので
教えていただけると助かります。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

難しいですね・・・ 私は、VBはできませんが読むならって程度ですが。

。。

ファイルのコピーを行う処理が重たくて、進度を表示したいというのはわかります。
なぜループと質問者さんのソースでのコピーでは、プログレスバーの動きが違うかというと、ループでは100回転するとしたら100回同じ場所を通るので、何回通ったというのが分かるのですが、コピーだとコピーの処理で1回となります。なのでコピーの場合は、コピーが終了したらプログレスバーがすべて動きます。(説明へたでスミマセン)

そこで、調べたのですがマルチスレッドで処理を行うっていいみたいです。
リンク先で議論?されてるみたいなので参考程度にお願いします。

何もわからなくてすみません。。。 orz

参考URL:http://homepage1.nifty.com/MADIA/vb/vb_bbs2/2005 …

この回答への補足

回答ありがとうございます。
リンク先を読んだのですが
初心者の私にはさっぱりです・・・
PC自体は8割シングルですので作成するのは
時間がかかりそうですね・・・・

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

補足日時:2009/06/03 12:01
    • good
    • 0

System.IO周りを探ってみましたが、非同期のファイルコピーは見当たりませんでした。



どうしても自アプリ内でプログレスを動かしたい場合、2つの方法を思いついたので挙げておきます。

方法1:ファイルコピーを自力で行う
コピー元ファイルを開き、コピー先ファイルを空で用意します。
コピー対象のファイルから一定量読み取り、コピー先へ書き込み、プログレスバーを進めます。これを繰り返すことで進捗状況がわかります。

ただし、ファイルの属性や更新日・最終アクセス日がコピーした時点の日時になるなどの自力で調整しないといけない部分があります。
イメージとしては、ファイルをアプリで開き「名前をつけて保存」で別名を指定しているのと同じ。

方法2:WinAPIを使う
CopyFileExというAPIを使うと、APIが進捗状況をコールバック関数に送ってきてくれます。一般的にはこっちの方法が使われていると思います。
VB6.0であれば実行できますが.NETでは試したことがありません。また、コピーを中止する手続きも自分で用意する必要があります。特にコールバック関数を使うあたりが
> まったくの初心者レベル
とおっしゃっているので、かなり敷居が高いかと思われます。

この回答への補足

遅れましてすみません
やはりAPIですか・・・
敷居が高いので自分で能力を高めて
挑戦してみたいと思います。

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

補足日時:2009/06/04 07:22
    • good
    • 0

FileIO.FileSystem.CopyFile メソッドを使用すれば


普通に操作でコピーしたときのようなダイアログは表示させることが
できますので参考までに。

この回答への補足

そうなのですか!?
まったくの初心者レベルなので
助かります。

さっそく試してみます。
情報ありがとうございます。

補足日時:2009/06/03 13:23
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。

Qvbsでファイルやフォルダのコピー中にプログレスバーを表示させるにはど

vbsでファイルやフォルダのコピー中にプログレスバーを表示させるにはどうすればいいでしょうか。
無言でコピーするコードはいろいろと紹介されているのですが、何も表示されないので進行状況がわかるようにしたいのです。
残り時間表示やパーセント表示などどのような表示方法でもいいのでおおよその進行状況がわかる方法をご存知でしたら教えて頂けないでしょうか。
宜しくお願い致します。
<例>
コピー元ファイル:"C:\test\*.*"
コピー先フォルダ:"C:\backup\"

Aベストアンサー

●ファイルのコピー中に視覚的なインジケータを表示する方法はありますか
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/oct06/hey1010.mspx
にそのままの例が載っております。

Const FOF_CREATEPROGRESSDLG = &H0&
strTargetFolder = "C:\backup\"
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(strTargetFolder)
objFolder.CopyHere "C:\test\*.*", FOF_CREATEPROGRESSDLG

QDataGridViewでコードで値を入力したい

VB2005のDataGridViewですが、行と列を指定して
そのセルに値を入力したいと思いますが、どのプロ
パティに行番号・列番号を入れればいいのでしょうか?

Aベストアンサー

VB2005のDataGridView.rows(1).cells(2).value=3

Qすでにファイルが開かれている時のエラー回避

VB2010で、ファイルを開いていると下記のコードでエラーがでます。
Dim SR As New System.IO.StreamReader(AppPath & "諸元一覧.csv", System.Text.Encoding.Default)

「諸元一覧.csv」ファイルを閉じてください。
とメッセージを出し、ExitSubしたいのですが、
どういうコードにすればよいのでしょうか。
教えてください。よろしくお願いいたします。

Aベストアンサー

先の回答にあるように、ファイルを開いていてもエラーが出ない場合もあります。

ファイルがロックされている場合は IOException が発生するようなので、
Try ~ Catch で IOException をエラートラップする方法もあります。
(※ただのエラートラップではファイルが存在しない等の他のエラーと
 区別できませんので、エラーの種類まで限定してエラートラップします。)

Q他のフォームから別のフォームのサブルーチンを呼び出す

例えばフォームAからフォームBのCommand1_clickというサブルーチンを呼び出そうとすればどのようにすればいいんでしょうか?

私は

Call FormB!Command_click

とフォームAに書きましたがうまくいきませんでした

Aベストアンサー

Command1のClickイベントプロシージャの

Private Sub Command1_Click()
'(・・処理・・)
End sub



Public Sub Command1_Click()
'(・・処理・・)
End sub

に書き換えて下さい(「Private」→「Public」)。
こうすることにより、他のフォームから呼ぶことが可能になります。
ただしこのやり方は奨励しません(※後述)

また、呼び出し方も間違ってます。

Call FormB!Command_click

ではなく、

Call FormB.Command_click

として下さい(「!」→「.」)。

※自動生成するイベントプロシージャの構文を直接いじるのはあまり奨励しません(特に問題は発生しませんが)。
直接イベントプロシージャを呼ぶのではなく、下記のようにしてみてはいかがでしょう。

※下記をFormBに記述

Private Sub Command1_Click()
Call subCommand1Click
End sub

Public Sub subCommand1Click()
'(・・処理・・)
End sub

FormAではこのように呼ぶ
Call FormB.subCommand1Click

Command1のClickイベントプロシージャの

Private Sub Command1_Click()
'(・・処理・・)
End sub



Public Sub Command1_Click()
'(・・処理・・)
End sub

に書き換えて下さい(「Private」→「Public」)。
こうすることにより、他のフォームから呼ぶことが可能になります。
ただしこのやり方は奨励しません(※後述)

また、呼び出し方も間違ってます。

Call FormB!Command_click

ではなく、

Call FormB.Command_click

として下さい(「!」→「.」)。

※自動生成...続きを読む

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QFSO.CopyFileでのエラー無視方法

コピー元フォルダにあるxlsファイルを全てコピー先のフォルダにコピーするVBAを作っています。
既にコピー先フォルダに同名のファイルがある場合は上書きせずスキップし、
コピー先フォルダに無いファイルだけコピーしたいのですが、

Sub test()
Dim FSO As Object
Dim md As String

Set FSO = CreateObject("Scripting.FileSystemObject")
Set md = Format (Date, "MMDD")

FSO.CopyFile "C:\コピー元\*.xls", "C:\コピー先\"& md ,False

Set FSO = Nothing
End Sub

FSO.CopyFileをFalseにするとコピー先に同名のファイルがある場合に
エラーで止まってしまいます。
このエラーを無視してコピーを続ける方法はありますでしょうか。

今回は確認ダイアログなど一切出さずに処理する方法が知りたいのですが、
今後の為に同名のファイルがあれば上書き確認ダイアログを出し、
処理を分岐させる方法もありましたらヒントだけでも教えて頂けると嬉しいです。

作成はExcel2010ですが、Excel2002でも動作するように作りたいです。
よろしくお願いいたします。

コピー元フォルダにあるxlsファイルを全てコピー先のフォルダにコピーするVBAを作っています。
既にコピー先フォルダに同名のファイルがある場合は上書きせずスキップし、
コピー先フォルダに無いファイルだけコピーしたいのですが、

Sub test()
Dim FSO As Object
Dim md As String

Set FSO = CreateObject("Scripting.FileSystemObject")
Set md = Format (Date, "MMDD")

FSO.CopyFile "C:\コピー元\*.xls", "C:\コピー先\"& md ,False

Set FSO = Nothing
End Sub

FSO.CopyFileをFalseにするとコピー先に同...続きを読む

Aベストアンサー

#1です。ループを回していないのですね、失礼しました。
On error resume nextで通用するのは、ファイル毎にループ処理してコピーしているケースです。
ファイル毎にループを回し、既存かどうかの問い合わせをして処理する一例です。
ご参考まで。

Sub test()
Dim FSO As Object, targetFolder As Object, targetFile As Object
Dim folderName As String, destFilePath As String, answer As String

folderName = "C:\コピー元\"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set targetFolder = FSO.getfolder(folderName)
For Each targetFile In targetFolder.Files
'拡張子判別のところは必要によりアレンジして下さい
If UCase(FSO.GetExtensionName(targetFile)) = "XLS" Then
destFilePath = "C:\コピー先\" & Format(Date, "MMDD") & "\" & targetFile.Name
If FSO.FileExists(destFilePath) Then
'既存なら問い合わせせずにパスする場合は、Thenの時の処理をコメントアウトして下さい。
answer = MsgBox(targetFile.Name & " がCopy先に存在します。上書きしますか?", vbYesNo)
If answer = vbYes Then FSO.CopyFile targetFile, destFilePath, True
Else
FSO.CopyFile targetFile, destFilePath, False
End If
End If
Next targetFile
Set FSO = Nothing
End Sub

#1です。ループを回していないのですね、失礼しました。
On error resume nextで通用するのは、ファイル毎にループ処理してコピーしているケースです。
ファイル毎にループを回し、既存かどうかの問い合わせをして処理する一例です。
ご参考まで。

Sub test()
Dim FSO As Object, targetFolder As Object, targetFile As Object
Dim folderName As String, destFilePath As String, answer As String

folderName = "C:\コピー元\"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set targetFolder = FSO...続きを読む

QVBでEXCELのシートのコピーに関して

同一Book内で、シートのコピーをしようと考えて、幾つかのHPを参考に、以下のような
記述をしました。

その際に、以下の記述をした場合、本来はコピー先のシート名を変更したいにも関わらず、コピー
元のシート名が変わってしまいます。

追加したシートの名前を変更させるには、どのような書き方にすれば良いでしょうか?

自分で記述しておきながら、どのように対応したら良いかわからず。。。

また、以下のような記述をした場合、追加したセル側のシートを操作したいにも関わらず、
コピー元のシートを書き換えてしまいます。

追加したシートのセルを操作したい(値を入力)ような場合は、どのような記述を
すれば良いでしょうか。。。

ご教授頂ければと思います。

'既存のEXCELファイルを開く
Dim xlFilePath As String = "C:\test.xls"

'起動時の処理
Dim xlApp As New Excel.Application
Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath)

'確認のためExcelのウィンドウを表示する
xlApp.Visible = True

Dim xlSheets As Excel.Sheets = xlBook.Worksheets
Dim xlSheet As Excel.Worksheet = CType(xlSheets.Item(1), Excel.Worksheet)
Dim xlSheet2 As Excel.Worksheet = xlBook.Worksheets(1)

'シートのコピー
xlSheet.Copy(After:=xlSheet2)

'シートに名前を付ける
xlSheet.Name = "TEST"

Dim xlRange As Excel.Range

'データの入力セル範囲
xlRange = xlSheet.Range("A1:A1")

'セルへデータの入力
xlRange.Value = “AABBCC”

同一Book内で、シートのコピーをしようと考えて、幾つかのHPを参考に、以下のような
記述をしました。

その際に、以下の記述をした場合、本来はコピー先のシート名を変更したいにも関わらず、コピー
元のシート名が変わってしまいます。

追加したシートの名前を変更させるには、どのような書き方にすれば良いでしょうか?

自分で記述しておきながら、どのように対応したら良いかわからず。。。

また、以下のような記述をした場合、追加したセル側のシートを操作したいにも関わらず、
コピー元のシートを書き...続きを読む

Aベストアンサー

う~ん
サンプルのステートメントをよく噛みしめていますか?
現在のシート数はどうやって求めましたか?
Worksheets.Count ですよね。これが常に現在の
シート数を持っているのです。コピーして、シートが
増えたらこのCountプロパティも増えます。
論理的には以下のようなコードになるでしょう。

Dim 現シート数 As Integer
Dim 最終シート As Excel.Worksheet
Dim 最新シート As Excel.Worksheet

Do
  '末尾にシートをコピーする
  現シート数 = xlBook.Worksheets.Count
  最終シート = xlBook.Worksheets(現シート数)
  xlSheet.Copy(After:=最終シート)
  最新シート = xlBook.Worksheets(現シート数 + 1)
  '***** 何らかの処理 *****
  If 終了 Then Exit Do
Loop

尚、最初からシート数が分かっているような実務は
殆どありませんよ。30年以上この商売してますが、
そんなのは1回あったかなかったくらいです。

ついでに言うと、複数形のものはコレクション、
単数形のものはオブジェクトと言います。
Workbooksはコレクションで、Workbookの集合です。
だから、Count(個数)があり、メンバを追加する意味で
Add(新規ブック作成)やOpen(既存ブックを開く)という
メソッドがあります。メンバを減らすのはCloseです。
同様にシートもWorksheetsとWorksheetがあります。
AddやCopyでメンバが増え、Deleteで削除されます。
コレクションからはインデックスか名前を指定すると
オブジェクトが得られます。上記もインデックスで
コレクションからオブジェクトを得ていますよね。
こういう関係を知らないと正確なプログラムは作れ
ません。

う~ん
サンプルのステートメントをよく噛みしめていますか?
現在のシート数はどうやって求めましたか?
Worksheets.Count ですよね。これが常に現在の
シート数を持っているのです。コピーして、シートが
増えたらこのCountプロパティも増えます。
論理的には以下のようなコードになるでしょう。

Dim 現シート数 As Integer
Dim 最終シート As Excel.Worksheet
Dim 最新シート As Excel.Worksheet

Do
  '末尾にシートをコピーする
  現シート数 = xlBook.Worksheets.Count
  最終シート = xlBook.Worksh...続きを読む

QVB.net 引数で配列変数を渡す際の要素数

VB.net 2010 の質問です。

配列変数を他のプロシージャに引数で渡す際の、配列変数の要素数をあらかじめ宣言していないとエラーになります。


Dim Hairetsu() As String ' ←エラー
Dim Hairetsu(100) As String ' ←正常


Public Sub aaa(ByRef Hairetsu() As String)

Hairetsu(0) = "Test" '←正常の場合と、エラーの場合

End Sub


Hairetsu(100) のように、要素数を宣言していると、エラーにならないのですが、
プログラム中、要素数がどこまで増加するか、分かりません。
Hairetsu()のように、要素数未確定の配列変数を渡すことは出来ないのでしょうか。


ご存知の方がいらっしゃいましたら、なにとぞアドバイスの程、よろしくお願いいたします。

Aベストアンサー

まずは、VB.NETでの配列の正体を知っておいた方がよいでしょう。
http://msdn.microsoft.com/ja-jp/library/dd314345.aspx
特に
> 3-3-3 参照型としての配列変数
から下をよく読んで理解してください。


> Dim Hairetsu() As String

は、Stringの配列を覚えることができる変数Hairetsuを用意するだけで、配列の実体は用意されません。
上記URLの「図 3-11 Nothing が代入されるのは、あくまで配列変数 D 自体」が近い状態です。
この図の「配列の実体」が最初から存在しない、というものです。


> Public Sub aaa(ByRef a() As String)
> a(0) = "Test" '←正常の場合と、エラーの場合

※ 念の為、仮引数の名前を変えました。

このsubを aaa(Hairetsu) と呼び出した場合、 Hairetsu() しただけの場合は、a = Nothing となっています。
よって、 a(0) は Nothing(0) ということになり、そんなものは無いのでエラーになります。

※ エラーメッセージはちゃんと読みましょう。
※ 質問するなら、ただ「エラーになります」では対処しようがありません。
※ 正確なエラーメッセージを記載るようにしましょう。
※ 例えば、そのエラーは
※ 「 NullReferenceException "オブジェクトのインスタンスを指定する必要がある部分に null 値が指定されています" 」
※ とか表示されていませんでしたか?



対策ですが、いくつもあるので、目的によって選択することになります。
○ aaa内で Nothingだったら処理を中止するようなコードにする
例) if a is Nothing then exit sub
○呼び出し元で、Hairetuをredimしてからaaaを呼び出す。
○aaa内でredim する。仮引数aはByRefになっているので、呼び出し元の変数が変更される。
 ※ なお、参照型の特性として「a(0) = "Test" 」だけなら、ByVal a でも同じ「配列の実体」にアクセスすることになります。
○ sub aaaではなく、 function aaa() as String() 等といった配列も返す関数にする
○ List(of T) 等の可変長で配列っぽく使えるクラスを使う

まずは、VB.NETでの配列の正体を知っておいた方がよいでしょう。
http://msdn.microsoft.com/ja-jp/library/dd314345.aspx
特に
> 3-3-3 参照型としての配列変数
から下をよく読んで理解してください。


> Dim Hairetsu() As String

は、Stringの配列を覚えることができる変数Hairetsuを用意するだけで、配列の実体は用意されません。
上記URLの「図 3-11 Nothing が代入されるのは、あくまで配列変数 D 自体」が近い状態です。
この図の「配列の実体」が最初から存在しない、というものです。


> Public Sub a...続きを読む

Qxcopyコマンドの進行状況を表示させたい。

掲題の件ですが、xcopyコマンドを実施するバッチファイルを作成したのですが、xcopy実行時にlogファイルを出力させている為、進行状況がわからない状態の為進行バーみたいなのを表示させたいと思っています。
xcopy %Epass% %backup% /s/e/i/h >%Fpass%\logs.txt

どなたかご教授いただけますでしょうか。

Aベストアンサー

No2,No3です。失礼しました。提示したコマンドに誤りがありました。
誤:
xcopy %Epass% %backup% /s/e/i/h c:\temp\tee.cmd %Fpass%\logs.txt
正:
xcopy %Epass% %backup% /s/e/i/h | c:\temp\tee.cmd %Fpass%\logs.txt

No2で提示したコマンド
誤:
xcopy %Epass% %backup% /s/e/i/h tee.cmd %Fpass%\logs.txt
正:
xcopy %Epass% %backup% /s/e/i/h | tee.cmd %Fpass%\logs.txt

tee.cmd の前にパイプ記号の | を付けてください。
オプション /Y もつけた方が良いです。確認メッセージが表示され、それに反応して人間が応答すると、tee.cmdが誤動作します。


人気Q&Aランキング