こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

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

A 回答 (8件)

簡単に言うと、


OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。
    • good
    • 3
この回答へのお礼

temtecomai2さん
とても詳しい御回答どうもありがとうございました。
今回、『再描画』という意味を初めて知りました。
勉強になります!

temtecomai2さんの書いていただいたコードをコピペしてみて
試してみました!
おかげ様でDoEventsの効果がよくわかりました。

それとDoEventsを入れるのと入れないのでは処理速度も違うんですね。
下の例ではDoEventsを入れた方は78秒、入れなかったほうは25秒でした。
これって制御をOSに渡す時間が下のコードの例では53秒(78-25)も掛かるって事なんでしょうか?

お礼日時:2006/03/06 22:00

No.7 の件について


このカテゴリーがVisual Basicの為、うっかりVBでプログラム
を作ってしまっていました。
手もとにあるExcel97とExcel2000とで作成してみましたが、
テキストボックスにGotFocusプロパティ自体無く、且つ実行
してもエラーも発生しませんでした。
(Win98SE 及びWin2000)

どうも 19746999 さんが使用しているExcel とはバージョン又
は実行環境が異なる為、動作が異なっている事が考えられ
ます。
    • good
    • 0
この回答へのお礼

don_goさん
こんにちは

・・しまった。。
「EXCELのVBAに関する質問」
って最初に書くの忘れていました。
ごめんなさい。これからは気をつけます・・・。

そうですね!
僕が使っているのはEXCEL2002で
VBAのバージョンは
Microsoft Visual Basic 6.0です。

結局違いがわからないままですが、
過去に書いていただいた方の
アドバイスを参考にして
理解していこうと思います。

それではあと1,2日で質問を締め切ろうと思います。
ポイントあげる人迷うなぁ・・・

お礼日時:2006/03/13 20:26

間違いの例としては、あまり良いのが浮かばなかったので申し訳ありませんが...


DoEvents の有無により動作の違う例を

Private Sub Text1_GotFocus()
MsgBox "GotFocus"
End Sub

Private Sub Command1_Click()
Text1.Text = 1
Text1.SetFocus
DoEvents

MsgBox "hoge"
End Sub
    • good
    • 1
この回答へのお礼

don_goさん
こんにちは
具体的なご回答ありがとうございます。

・・大変申し訳ないのですが
ユーザーフォームを作って
コマンドボタンとテキストボックスを
そのユーザーフォームの上に作って
(もちろんオブジェクト名は統一させました。)
教えていただいたイベントプロシージャを
コピペして試してみたのですが、
よくわかりません。

と言うより「Gotfocus」イベントが働きません。
なのでDoeventsの有無にかかわらず動きが同じに感じます。

試しにシート上にテキストボックスを作って
教えていただいたコードを入力して
(もちろんオブジェクト名は統一させた。)
Gotfocusイベントが働くか確認するために
そのテキストボックスをクリックすると、
ちゃんとGotfocusイベントが動くのですが、

コマンドボタンをクリックしてマクロを実行すると
setfocusメソッドでのところで下記のエラーが出てしまいます。
       ↓
オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438)

いろいろ考えたのですが
どこが間違っているのかわかりませんでした。

わかりにくい質問だと思いますが
何が間違っているのか教えていただけませんか?
何度も質問してしまって申し訳ございませんが
よろしくお願いします。

お礼日時:2006/03/12 11:22

DoEventsは、MS-WindowsがUNIXやLinux等のマルチタスクOSではなく、


疑似マルチタスクで有るため必要になるものです。
通常マルチタスクOSでは、同時に実行される各種のプログラムに対して
処理に必要な時間と順序をOSが配分して実行しますが、MS-Windows
ではプログラムから処理が戻ってから(今回ではプロシージャが終了して
から)、次のプログラムやキー入力、マウス入力イベント等を実行します。
従って、時間のかかる処理や無限ループなどがあると、他の処理が実行
できなくなり、極端に全体の反応が遅くなったり、動かなくなったりします。
#画面が白くなるのは、表示の更新が行われなくなるためです。
そうなる事を防ぐ為、DoEventsを実行して、他のプログラムやイベント
処理を実行させる必要があります。

但し、Form上のコントロールに対して値をセットした後、DoEventsを実行
した場合、ChangeやGetFocusイベントが実行され、思っていなかった動作
をする事があるので、使用する場所には十分注意する必要があります。
    • good
    • 1
この回答へのお礼

don_goさん
ご回答ありがとうございます。
たくさんのわかりやすいご回答を頂いてきましたが
更に重要な回答を投稿していただいてうれしいです。

それから、もしよろしければ

>但し、Form上のコントロールに対して値をセットした後、DoEventsを実行
した場合、ChangeやGetFocusイベントが実行され、思っていなかった動作
をする事があるので、使用する場所には十分注意する必要があります。

ごめんなさい・・・この部分もう少し詳しく教えていただけないでしょうか。

面倒くさかったら無視してください^-^

お礼日時:2006/03/09 08:19

題意と違うかも知れませんが。


For ~ Next文は、とっても強力で、
中の処理が終了するまで、他のWindowsの処理にすら移りません。
この中に重い処理を入れると、再描画が掛からなくなり、ユーザーフォームが真っ白になったりします。
    • good
    • 0
この回答へのお礼

colhanさん
ご回答ありがとうございました。

>題意と違うかも知れませんが。
とんでもない・・・
とても参考になりましたよ^-^

もうこれ以上良い回答は頂けないかと思ってましたが
待ってみるもんですね♪

お礼日時:2006/03/06 22:27

表題の>DoEvents関数って何?


について、DoEventsは関数に分類されず、「ステートメント」に分類されています。
VBAの解説書などでは、
オブジェクト
プロパティ
メソッド
ステートメント
関数
に分類されています。念のため。
意味はWEBで照会してください。
ーー
DoEventsもOKWAVEで質問して、聞くのも良いが、WEB照会したら、働きの説明も、実例も多数出てきますよ。
    • good
    • 1
この回答へのお礼

imogasiさん
ご回答ありがとうございました

>DoEventsもOKWAVEで質問して、聞くのも良いが、WEB照会したら、働きの説明も、実例も多数出てきますよ。

・・・本当だいっぱい出てきた。

教えていただいてありがとうございます。。。

お礼日時:2006/03/06 22:20

Windowsはイベント-なにかが起きることー


(しかし、それは予期せぬものではなく約束されたもの)
が発生することにより動作します。
たとえばキーが押されたとか、時間が来たとか。

CPUは1っこしかないのでタイムシェアーでいろいろな
プログラムがイベントを発生させて動いています。

しかし、あなた(ユーザー)がそのことを考えずにプログラミング
すると、他のプログラムは自分の番が来ないので動けなくなり、
画面が真っ白になったままになったりするわけです。

最初のコードはCPUを占領します。(そうなっちゃう)
2番目のコードはDoEvents のところで一回処理を止め、
(windows に渡し)次に自分の番がきたときに、
次のステップを続けます。
当然処理速度は桁違いに遅くなります。
    • good
    • 1
この回答へのお礼

otto0001ottoさん
わかりやすいご回答ありがとうございました。

VBAもまだまだ未熟者ですが
パソコン全体の事はもっとド素人です。
もっとパソコンについてオールラウンドな
知識を身につけることが大切だと思いました。
これからも日々勉強を怠らずに頑張ります♪

また何かわからないことがあったら
よろしくお願いします。

お礼日時:2006/03/06 22:12

For文を使う必要があるのでしょうか?



Range("A1:A5000).ClearContents
一瞬で終わるはずですよ。
    • good
    • 0
この回答へのお礼

hana-hana3さん
おはようございます。

ご回答ありがとうございます。
そうか!clearContentsメソッドの存在をすっかり忘れてました。

質問以外のことも教えていただいてどうもありがとうございます。
これからもよろしくお願いいたします。

お礼日時:2006/03/06 07:27

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

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

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

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

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

QVBAで、アクティブなBOOKのファイル名を取得し

エクセルのVBAを使用して、選択されている、BOOKのファイル名を取得し、下記のように編集してA1セルに入れたいのですが、可能でしょうか?


BOOKのファイル名が「大阪_たこ焼き_1234.xls」の場合

大阪_と.xlsをは省いて、「たこ焼き_1234」がA1セルに入るようにしたい。

Aベストアンサー

拡張子なんでもござれ!
Sub TheBody()
Const xSeparator = "_"
Const xPeriod = "."
Dim KitCut As Variant
KitCut = Split(ActiveWorkbook.Name, xPeriod)
KitCut = Split(KitCut(0), xSeparator)
Range("A1").Value = KitCut(1) & xSeparator & KitCut(2)
Columns("A").AutoFit
End Sub

QExcel VBA で処理中断(DoEvents)ができなくて困ってい

Excel VBA で処理中断(DoEvents)ができなくて困っています。

まず、CommandButton1ボタンでSampleをコールし、Sample処理の中でループを廻し、途中でCommand1ボタンをクリックして、処理中断(DoEventsによって)をいれたいと思っています。

しかし、Command1ボタンをクリックしても処理中断がきかないのです。
グローバル変数fStopにはCommand1ボタンをクリックしたときにTrueが入っていることは、MsgBoxで確認していますが、Sample処理の方に値がつたわっていないようで、ループが最後まで止まりません。
コードが悪いのでしょうか、それとも、DoEventsの使い方が悪いのでしょうか。
もし、DoEventsが使えないのであれば、代替手段はありますでしょうか。
(長時間の印刷中の処理中断に応用したいと思っています)

環境はExcel 2002 SP3 , VB 6.0 , Windows XPです。
なお、DoEventsのコードは以下のURLを参考にして作成しました。
http://officetanaka.net/excel/vba/function/DoEvents.htm

コードは以下のとおりです。
'*********
Dim fStop As Boolean 'グローバル変数を宣言
'*********
Sub Sample()
Dim i As Long
fStop = False
For i = 1 To 1000000
DoEvents
If fStop = True Then
MsgBox "処理が中断されました"
Exit For
End If
Next i
End Sub
'********
Private Sub CommandButton1_Click()
Call Sample
End Sub
'********
Private Sub Command1_Click()
fStop = True
MsgBox "fStop=" & fStop
End Sub

Excel VBA で処理中断(DoEvents)ができなくて困っています。

まず、CommandButton1ボタンでSampleをコールし、Sample処理の中でループを廻し、途中でCommand1ボタンをクリックして、処理中断(DoEventsによって)をいれたいと思っています。

しかし、Command1ボタンをクリックしても処理中断がきかないのです。
グローバル変数fStopにはCommand1ボタンをクリックしたときにTrueが入っていることは、MsgBoxで確認していますが、Sample処理の方に値がつたわっていないようで、ループが最後まで止まりません。
コ...続きを読む

Aベストアンサー

当方xl2000ですが、提示されたコードで問題なく動作いたしました。
動作が分かり易いようにラベルを一個追加しています。
Dim fStop As Boolean

Sub Sample()
Dim i As Long
fStop = False
For i = 1 To 1000000
DoEvents
Me.Label1.Caption = i
If fStop = True Then
MsgBox "処理が中断されました"
Exit For
End If
Next i
End Sub

Private Sub CommandButton1_Click()
Call Sample
End Sub

Private Sub CommandButton2_Click()
fStop = True
MsgBox "fStop=" & fStop
End Sub

Private Sub UserForm_Initialize()
Me.Label1.Caption = 1
End Sub

'○標準モジュール
'Sub test()
' UserForm1.Show 'vbModeless
'End Sub

当方xl2000ですが、提示されたコードで問題なく動作いたしました。
動作が分かり易いようにラベルを一個追加しています。
Dim fStop As Boolean

Sub Sample()
Dim i As Long
fStop = False
For i = 1 To 1000000
DoEvents
Me.Label1.Caption = i
If fStop = True Then
MsgBox "処理が中断されました"
Exit For
End If
Next i
End Sub

Private Sub CommandButton1_Click()
Call Sample
End Sub

Private Sub CommandButton2_Click()
fStop = True
MsgBox "fStop=" & fStop
End Sub

Private Sub UserForm_Initial...続きを読む

QExcelVBA:自己のBook名を取得したい

WindowsXP-Proです。
Excelヴァージョンは2003です。

ExcelVBAでコーディングしています。
で、自分自身(つまり、このVBAコードを記述しているExcel本体)のBook名を取得したいのですが、何か関数は用意されていますでしょうか?

自分自身のBook名を取得したい理由は、VBAコードを記述しているExcel本体のファイル名(Book名)の名前が変更されても、VBAが正常に機能するように、今現在のBook名を取得したいのです。

複数のExcelファイルを、このVBAで操作しているため、
Workbooks("本体のBook名").Activate
を用いており、仮にファイル名(本体のBook名)の名前が変更されても、VBAが正常に機能できるように、"本体のBook名"部分を固定ではなく、可変で持てるようにしたいからです。

Aベストアンサー

Public Sub Auto_Open()
  MsgBox ActiveWorkbook.Name
  MsgBox ThisWorkbook.Name
End Sub

Private Sub Workbook_Open()
  MsgBox Me.Name
End Sub

いずれも、ブック名が表示されました。

Q【エクセルVBA】関数をVBAに置き換える

はじめまして、VBA初心者です。

Large関数を使って以下のような計算をしています。
=LARGE($C2:$F2,1)-LARGE($C2:$F2,2)

これをVBAに置き換えたいと思っており、以下のようにしておりますが、
うまくいきません。
どのようにすればよいでしょうか。

For i = 2 To endrh
Range("I" & i) = WorksheetFunction.Large("C&i:F&i", 1) - WorksheetFunction.Large("C&i:F&i", 2)

Next i
Range("G1").Select

Aベストアンサー

#1さんの回答どおりです

スッキリしたコードは、間違いを見つけやすいので
ちょっと修正してみました

Dim a As String

For i = 2 To endrh
a = "C" & i & ":F" & i
Range("I" & i) = Evaluate("LARGE(" & a & ",1)-LARGE(" & a & ",2)")
Next i
Range("G1").Select

参考までに

Q他のワークシート名の取得方法 (VBAを使用せずに)

VBAを用いずに、ワークシート関数のみでワークシート名を取得できないか探しています。

自分のシート名は、以下の出力結果の一部より取得することができました。
=CELL("filename")

しかし、他のシート名を取得する方法が思いもつきません。

VBAを用いずにシート名を取得することはできないのでしょうか?

Aベストアンサー

Excel2000でしたら、
1.[挿入]-[名前]-[定義] から、名前を2つ定義します。
  ・名前:PPP  参照範囲:=GET.WORKBOOK(1)
  ・名前:QQQ  参照範囲:=GET.DOCUMENT(88)
2.A1 に =SUBSTITUTE(INDEX(PPP,ROW()),"["&QQQ&"]","") と入力します。
3.A1 を下方にドラッグコピーすると、シート名が一覧で表示されます。

例えば3枚目のシート名のみを取得する場合は、任意のセルに
=SUBSTITUTE(INDEX(PPP,3),"["&QQQ&"]","") と入力します。

※マクロ関数というものですが、最近のバージョンにこれが付帯されているのかどうか
  わかりませんが。   ^_^;

Qサイトの開設について、 こんにちは。 プログラミングなどやったことがない初心者です。 私は、私から発

サイトの開設について、
こんにちは。
プログラミングなどやったことがない初心者です。
私は、私から発信するブログのようなサイトではなくて、例えば読書メーターのように利用者さんが読書をグラフ化して他の利用者と共有したり、つぶやけたりする感じのサイトを作りたいです。(←の例と同じようなことをやりたいんですが、自分で思い付いたアイディアなので読書メーターを例として出しました。)
そのためには、どのようなプログラミング言語を使用したらいいでしょうか。
一応スウィフトなど調べましたが、どれを使ったらいいのかわかりません。
またそれができるパソコンは限られていますか?それともどんなパソコンでも大丈夫でしょうか?
よろしくお願いします。

Aベストアンサー

先ずはhtml+css(スタイルシート)を使いこなせないと話しにはなりません。html&スタイルシート(css)レッスンブックを書店で買えますから、そこから研鑽して下さい。

その後はjavaとかPHPとかに進みます。

最終的にはデータベース連携の為のASP(アクティブ・サーバ・ページ)になりますが、これは企業のプロレベルです。

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QVBAプログラミングについて教えてください

a→1、b→2、c→3、……というふうに読んで、例えば
a  1
f  6
h  8
g  7
e  5
b  2
f  6
c  3
d  4
a  1
エクセル上に左のアルファベットの列が与えられていて、それを
右のように対応した数字の列を横に書き表したいです。
初心者でして、わかりそうでわかりませんでした。
教えてください。お願いします。

Aベストアンサー

kokoichikoさんが学生さんで、
情報処理の基礎を学ばれて、内部コードが何たるかを理解されていて、
先生が内部コードの規則性を考えて貰うための問題であるのなら、
#1さん、#2さんの回答で大正解なんですが、

社会人で実務でエクセルを使おうとしている方でしたら、
はて、初心者と言われている方に内部codeの意味が分かるのかな?
-96 の意味が分かるのかな?
a→1、b→2、c→3、……は単なる例であって
本当は
りんご→100円、みかん→30円、バナナ→80円・・・
では無いのかな?と思うのは考え過ぎなのかな?
いやいや、初心者だから
りんご→100円、みかん→30円、バナナ→80円・・・を
a→1、b→2、c→3、……と例えることはできない。
の考えもあり得るな、、、うぅむ!

もっと応用的な実社会でも使えるような質問の意味合いがあるような気がします。
と勝手に問題をすり替えて、勝手に割り込んでしまいます。

問題をそのまま回答例にします。
a→1、b→2、c→3、……を少し離れた所にテーブルを作ります。
D1セルにa E1セルに1
D2セルにb E2セルに2
D3セルにc E3セルに3
D4セルにd E4セルに4



D26セルにz E26セルに26
とテーブルを作っておきます。

で、B1セルに、=VLOOKUP(A1,$D$1:$E$26,2,FALSE)
B列を下へコピー

これはエラー処理をしていませんので、エラー処理を入れるなら、
=IF(COUNTIF($D$1:$E$26,A1)=0,"",VLOOKUP(A1,$D$1:$E$26,2,FALSE))
B列を下へコピー

余計なお世話でした。

kokoichikoさんが学生さんで、
情報処理の基礎を学ばれて、内部コードが何たるかを理解されていて、
先生が内部コードの規則性を考えて貰うための問題であるのなら、
#1さん、#2さんの回答で大正解なんですが、

社会人で実務でエクセルを使おうとしている方でしたら、
はて、初心者と言われている方に内部codeの意味が分かるのかな?
-96 の意味が分かるのかな?
a→1、b→2、c→3、……は単なる例であって
本当は
りんご→100円、みかん→30円、バナナ→80円・・・
では無いのかな?と思うの...続きを読む

QVBAでアカウント名を取得する方法

VBAで処理したEXCELブックをデスクトップに自動保存しようとしています。VBAで現在作業中のユーザーアカウント名を自動で取得する方法を教えていただきたいのですが。

デスクトップ上にブックを保存するには、パスを記述すればよいのですが、現在PC毎にユーザーアカウントを設定しユーザー名が異なっています。
このため、PC毎にこのユーザー名をデスクトップへのパスに入れ込まなければなりません。毎回キーボードからこのユーザー名を入力する方法もありますが、自動的にユーザー名を取得し、正しいパスを指定する方法を検討しています。
どなたか、VBAでこのユーザー名を取得する方法が有れば教えていただきたいのですが。
よろしくお願いいたします。

Aベストアンサー

Environ関数で、環境変数[USERNAME]を取得する。

MsgBox Environ("USERNAME")

QVBAプログラミングの質問です。

Sheet1の第2列に行番号、4列に列番号、5列にそこの値が書かれたデータが並んでいます。
1 1 967
2 1 687
………
x y 802
………
x行、y列に802を代入するという感じです。全部で57985データあります。
前の回答を参考にして、48881データまではSheet2に
For k = 1 To 48881
Worksheets("Sheet2").Cells(1 + Worksheets("Sheet1").Cells(k, 2), 1 + Worksheets("Sheet1").Cells(k, 4)) = Worksheets("Sheet1").Cells(k, 5)
Next k
このようにプログラムを書いて納まって、残りの57985-48881=9104データの行列はSheet2に納まらなかったので、Sheet3に書こうと思い、下のように書きましたがプログラムがうまく動きませんでした。他にも試しましたが初心者のためダメでした。
Dim n As Long
Dim m As Long
n = 9104
m = 48881
For k = 1 To n
Worksheets("Sheet3").Cells(1 + Worksheets("Sheet1").Cells(k + m, 2), 1 + Worksheets("Sheet1").Cells(k + m, 4)) = Worksheets("Sheet1").Cells(k + m, 5)
Next k
48881というのが大きいため動かないと考えられますが、どのように対処したらよいかわかりません。教えてください。お願いします。

Sheet1の第2列に行番号、4列に列番号、5列にそこの値が書かれたデータが並んでいます。
1 1 967
2 1 687
………
x y 802
………
x行、y列に802を代入するという感じです。全部で57985データあります。
前の回答を参考にして、48881データまではSheet2に
For k = 1 To 48881
Worksheets("Sheet2").Cells(1 + Worksheets("Sheet1").Cells(k, 2), 1 + Worksheets("Sheet1").Cells(k, 4)) = Worksheets("Sheet1").Cells(k, 5)
Next k
このようにプログラムを書いて納まって、残りの57985-48881=9104データの行...続きを読む

Aベストアンサー

連続投稿申し訳ありません。

第2列と第4列の値が半角なのかどうかご確認下さい。
調査用に下記のように変更したマクロを使用すると便利かもしれません。

Dim n As Long
Dim m As Long
dim gyou As String
dim retsu As String

On Error Goto ErrorCheck
n = 9104
m = 48881
For k = 1 To n
gyou = Worksheets("Sheet1").Cells(k + m, 2)
retsu = Worksheets("Sheet1").Cells(k + m, 4))
Worksheets("Sheet3").Cells(1 + Worksheets("Sheet1").Cells(k + m, 2), 1 + Worksheets("Sheet1").Cells(k + m, 4)) = Worksheets("Sheet1").Cells(k + m, 5)
Next k

ErrorCheck:
MsgBox "Sheet1の" & Cstr(k + m) & "行目のデータがおかしいです。" & VBCrlf _
& "第2列 = " & gyou & ":第4列 = " & retsu

連続投稿申し訳ありません。

第2列と第4列の値が半角なのかどうかご確認下さい。
調査用に下記のように変更したマクロを使用すると便利かもしれません。

Dim n As Long
Dim m As Long
dim gyou As String
dim retsu As String

On Error Goto ErrorCheck
n = 9104
m = 48881
For k = 1 To n
gyou = Worksheets("Sheet1").Cells(k + m, 2)
retsu = Worksheets("Sheet1").Cells(k + m, 4))
Worksheets("Sheet3").Cells(1 + Worksheets("Sheet1").Cells(k + m, 2), 1 + Worksheets("Sheet1").Ce...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報