Excel VBA質問スレ Part8
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/08/25(月) 23:16:33前スレ http://pc11.2ch.net/test/read.cgi/tech/1212587819/
★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。
★2 ExcelのVBA以外の部分に関する質問はNGです。
但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。
★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
VBAとは、『Visual Basic for Application』の略で
Application
├Workbooks
|└Workbook
| ├Worksheets
| |└Worksheet
というApplication以下のオブジェクトを、VB言語で操作するものを指します。
例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
0322デフォルトの名無しさん
2008/09/21(日) 08:47:58テーブルを作成し、いくつか項目を入力した状態で、
GUIでテーブルの見出し行にある矢印メニューボタンを押した時に表示される
フィルタのメニューの処理を、VBAから行うにはどのようにすればよいでしょうか?
例えば、TODOリストを想像してください。
ボタンを配置して、ボタンを押すと、
テーブルの1つの列の「開始日付」が今日のもので、
「状態」列が「未完」となっているもののみを表示する。
また、他のボタンを押すと、元に戻る(というか全部表示)。
といったようなことをしたいのです。
画像を見てもらったほうが早いので、説明画像も作成しました。
http://sylphys.ddo.jp/upld2nd/pc3/src/1221954091856.jpg
どのようなクラスのオブジェクトにアクセスすればいいかだけでも、手がかりがあればと思います。
0323y
2008/09/21(日) 09:13:13チェックを入れたり外したりする操作を、「マクロの記録」(>>1★6)を使って記録して、
生成されたコードを見れば、どんなオブジェクトにアクセスしているか手がかりが
得られると思います。
0324デフォルトの名無しさん
2008/09/21(日) 09:37:36うざいからだろw
0325デフォルトの名無しさん
2008/09/21(日) 09:42:50ありがとうございます。
基本的なことを聞いてしまった様な気がします。テンプレ嫁よ俺。
「開始日付」を「今日」のみ選択、「状態」を「途中」「予定」「スキップ」のみ選んだ時は、
こんな感じで記録されていました。
ActiveSheet.ListObjects("作業記録").Range.AutoFilter Field:=2, Criteria1:= _
xlFilterToday, Operator:=xlFilterDynamic
ActiveSheet.ListObjects("作業記録").Range.AutoFilter Field:=1, Criteria1:=Array _
("途中", "予定", "スキップ"), Operator:=xlFilterValues
ListObjectsでListObject(テーブル)が得られて、そのRangeにAutoFilterをかますんですね・・・。
0326デフォルトの名無しさん
2008/09/21(日) 15:51:36同一ファイル内で、シート1上の左側にはシート1の内容、右側にはシート2の内容
のように分割して表示することは可能でしょうか?
(ウィンドウを別々に開くのではなく)
もしやり方があるのであれば教えてください。
Excel2003を使用しています。
よろしくお願いします。
0327デフォルトの名無しさん
2008/09/21(日) 17:20:230328デフォルトの名無しさん
2008/09/21(日) 20:07:05-------------------------------------------
【やりたいこと】
(1).ファイル保存ダイアログでファイル名を選択させる。
(2).新規ファイル名を入力することも可能にする。
(3).ファイル保存時に選択可能なファイルタイプ(拡張子)をVBAで指定する。
【直面している問題】
・Office.FileDialog で msoFileDialogSaveAs を指定すると(3)を満たす方法がわからない
・Office.FileDialog で msoFileDialogFilePicker を指定すると(2)を満たす方法がわからない
【環境】
WindowsXp SP3 + Excel2002 SP3
-------------------------------------------
よろしくお願いします。
0329デフォルトの名無しさん
2008/09/21(日) 21:06:15Excel.Application.GetSaveAsFilename
を使えばよかったんですね。
スレ汚し失礼。
0330デフォルトの名無しさん
2008/09/24(水) 00:40:370331デフォルトの名無しさん
2008/09/24(水) 07:22:11似てるけど全くの別物と思っておいた方がいいよ。
0332デフォルトの名無しさん
2008/09/24(水) 13:31:460333デフォルトの名無しさん
2008/09/24(水) 15:45:030334デフォルトの名無しさん
2008/09/24(水) 16:05:39何処に焦点当てるかで変わってくる
VB6とVBAは、構文規則は全く同じ
組込関数はほとんど同じ
組込オブジェクトは全然別物
>>333
そのVBAとVisual Basic for Applicationは意味違うからw
0335デフォルトの名無しさん
2008/09/24(水) 18:37:44と記述するとA2にデータの未入力状態ということで実行エラーが出てしまうのに、
With Worksheets("表")
.Select
.Range("A2").Select
End With
と記述するとエラーが出ずに問題なく実行されるのはなぜなの?
0336y
2008/09/24(水) 21:36:05そのセル範囲が含まれるシートが選択されていなければ、
実行時エラーが発生する仕様になっているためです。
>335の下のコードは、シートを選んでから、セル範囲を選んでいるので、エラーは発生しません。
上のコードも、「表」シートが選んである状態であれば、エラーは発生しません。
0337デフォルトの名無しさん
2008/09/24(水) 21:57:49こうすればいい。
>Worksheets("表").Select
>Worksheets("表").Range("A2").Select
# って、既に歪の人が書いていたか。
0338デフォルトの名無しさん
2008/09/24(水) 23:27:58xp・excel2002で、関数が物足りなくなってきたのでマクロとVBAの勉強始めました。
ネットで検索するとaccessにもVBAとかマクロとか関数も?あるようです?
同僚に挫折したaccessのVBAの本ならあるから1500円で譲るよ。と言われたのですが、
excelとaccessのVBAは同じものですか?全く別物でしょうか??
すみません、宜しくお願いします。
0339デフォルトの名無しさん
2008/09/24(水) 23:33:34AccessVBAの本ではVBの勉強にはなるかもしれないがExcelVBAの勉強にはならないので
1500円も出すくらいならちゃんとした本を買いましょう。
0340デフォルトの名無しさん
2008/09/24(水) 23:37:41VBAそのものは同じだけど操作対象が全く別物なのでお勧めできない
0341デフォルトの名無しさん
2008/09/24(水) 23:44:40レスdくすです。
つまり、同じものだけど違うものだから?エクセルのVBAの本を買うべき。
と言うことですね?ありがとうございました。
危うく、accessの本を読んでexcel挫折するところでしたw
0342デフォルトの名無しさん
2008/09/25(木) 00:42:240343デフォルトの名無しさん
2008/09/25(木) 15:13:33Dim Tbx As TextBox
Num = 0
For Cnt = 1 To 9
Num = Num + 1
Set Tbx = "TextBox" & Num
Tbx.Text = ""
Next
VBAは変数の型を自動変換してくれると考えて、これを実行すると、
「コンパイルエラー:型が一致しません」と出ちゃいます。無理かな。
0344デフォルトの名無しさん
2008/09/25(木) 16:09:13>Dim Tbx As TextBox
>Set Tbx = "TextBox" & Num←何がしたいんだ?
TextBoxは文字列ではないからコンパイル通らなくて当たり前だな
Set Tbx = Worksheets(1).OLEObjects("TextBox" & Num)
なら理解できる
0345デフォルトの名無しさん
2008/09/25(木) 16:39:59サンキュー!!!!!!!!!
0346デフォルトの名無しさん
2008/09/25(木) 16:45:25Dim Cnt, Num As Integer と書くと cntはVariant型だぞ
0347デフォルトの名無しさん
2008/09/25(木) 17:07:39わざわざ有難うございます。いただいたアドバイスをヒントに修正しました。
やりたかったのはUserForm1のコントロールTextBox1〜9までの値をクリアすることでした。
Private Sub CommandButton5_Click()
' TextBox1〜9までのTextプロパティの値をクリアする
Dim iCnt As Integer, iNum As Integer, oTbx As Control
iNum = 0
For iCnt = 1 To 9
iNum = iNum + 1
Set oTbx = UserForm1.Controls("TextBox" & iNum)
oTbx.Text = ""
Next
End Sub
0348デフォルトの名無しさん
2008/09/25(木) 18:48:290349デフォルトの名無しさん
2008/09/26(金) 09:26:40えっろっびっでぉー
0350デフォルトの名無しさん
2008/09/26(金) 18:02:31excelが対象なのに、VBAだけじゃ意味無いだろw
おとなしくメモ帳に書いとけ。
0351デフォルトの名無しさん
2008/09/27(土) 22:33:470352デフォルトの名無しさん
2008/09/27(土) 22:35:180353デフォルトの名無しさん
2008/09/27(土) 22:53:05VBAにエクセルが付いてくる…マ
>350は素人
0354デフォルトの名無しさん
2008/09/27(土) 23:28:04これ、笑うところ?
あ、マってプログラ"マ"じゃなくて"マ"ヌケってことか
それなら納得
プログラマがこんな本質を違えた愚かな発想するわけないもんなw
0355デフォルトの名無しさん
2008/09/28(日) 00:02:57サクラエディタにでも書けばいいじゃん。
0356デフォルトの名無しさん
2008/09/28(日) 00:09:480357ちら裏
2008/09/28(日) 06:12:413つとも全部違うと思って欲しい。
それぞれ用途がかなり違う。文法も基本的な部分は同じでも、
実際にコードしてみると、かなーり違うことがわかる。
例えばVBA(もしかしてVB.NETも)では識別子に漢字交じり日本語が使える。
DLLなどの外部モジュールを最も簡単に呼び出せるのはVB。
VB.NETでは網羅されて使いやすいCLRが使える。
Excel付属のVBAでは、これらは出来ないか出来ても酷く面倒
しかしExcelのVBAは
精々ユーザー定義関数の定義や、外部ファイル入出力関係の
典型処理の組み込みや、フールプルーフ目的のフォーム作成
といった補助的な利用に留めておくべきで、ExcelをVB
環境の一種として取り扱うのはやめたほうがいい。
(VBを学ぶ環境としては余り適していない)
0358デフォルトの名無しさん
2008/09/28(日) 08:25:19って何かと思っていたら、VBAの次世代版だったのか。
Office2003からVBAと並行して使えるようになっていたのな。
.NET2.0ベースで、VB.NET以外にもC#が使えるのは楽しそうだなあ。
>>356
VBAサポート打ち切ったら、マジ売れなくね?
0359デフォルトの名無しさん
2008/09/28(日) 12:22:40ひどい知ったかなので、初心者は信じないように。
0360デフォルトの名無しさん
2008/09/28(日) 12:56:22失敗の経験も貴重だから、確かにそうだな。
0361デフォルトの名無しさん
2008/09/28(日) 14:37:522008で「切り捨てて」AppleScriptに変更したら非難ごうごうで(当たり前)
次でやっぱりVBAを復活させるってさ
0362デフォルトの名無しさん
2008/09/28(日) 21:06:11意味がわからん
0363高島彩
2008/09/29(月) 15:57:370364HIRO ◆225xxx6ZSE
2008/09/29(月) 16:07:10(U( )
| |∨T∨ 皆さん、>>363をよろしくお願いします。
(__)_)
0365高島彩
2008/09/29(月) 16:12:29/∵∴∵∴\
/∵∴∵∴∵∴\
/∵∴∴,(・)(・)∴| / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|∵∵/ ○ \| < >>364 氏ねよ!!
|∵ /. ミ | 彡 | \_______
|∵.| \___|_/| ___
\| \__ノ / / \
\___/ /∧ \
/ ) | × | _ _
/ ,イ 、 ノ/ |●( ―= ̄ `ヽ, _
/ / | ( 〈 ∵. ・\ 〈__ > ゛ 、_―
| ! ヽ ー=- ̄ ̄=_\_(/ , ´ノ
| | `iー__=―_ ;, / / /
!、リ -=_二__ ̄_=;, / / ,'
/ / / /| |
/ / !、_/ / 〉
/ _/ |_/
ヽ、_ヽ
0366デフォルトの名無しさん
2008/09/29(月) 21:36:04ごく普通にやればいいだけだよ
VBやCでやるのと同じように
つーか、ワークシート使わない方法になると>>1にも書いてある通り
VBAではなくVB分野になるのでスレ違いだな
あとは自分で調べましょう
0367HIRO ◆225xxx6ZSE
2008/09/30(火) 00:14:01(U( ) >>366
| |∨T∨ ありがとうございます。
(__)_)
0368デフォルトの名無しさん
2008/10/01(水) 00:19:39ニコ動で一時期流行った侵略ゲームをExcelで再現してみたのですが、
やはり(?)あまり速度が出ません。
いろいろ頑張ってみたのですが、自分の限界に達したようなので、
速度が向上する方法がありましたらアドバイスをいただけると助かります。
http://uproda11.2ch-library.com/src/11122054.zip.shtml
0369368
2008/10/01(水) 00:36:04OS:Vista
私の環境では、ウィンドウを最大化しておかないと何故かフリーズしやすいです。
フリーズというか、画面は固まりますが裏では動いています。
0370デフォルトの名無しさん
2008/10/01(水) 03:44:42全く試さない上でVBA素人の俺が脊髄反射レス
・基点となるセルからoffsetで上下左右1ずつ隣のセルの値を取得して、
それを評価した方がいいんジャマイカ
・セルのプロパティのアクセスを都度行うのは重いから、
一度マップ範囲を c = Range("x:y") のように配列に入れて、
値から何とかした方がいいんジャマイカ
・ScreenUpdating を最初から False に(ry
嘘ですごめんなさい
0371デフォルトの名無しさん
2008/10/01(水) 07:26:33Randomize
Dim hsXmax As Integer 'マップの横最大値
Dim hsYmax As Integer 'マップの縦最大値
Dim hsMap() As Integer 'マップの戦闘力格納用配列変数
Dim i As Integer '行番号
Dim j As Integer '列番号
Dim hsMaxPow As Integer '最大戦闘力
Dim x As Integer 'For用
hsXmax = Cells(6, 57).Value
hsYmax = Cells(5, 57).Value
ReDim hsMap(1 To hsYmax, 1 To hsXmax)
For x = 1 To 1000
Application.ScreenUpdating = False
'マップに戦闘力を設定。マップの一番外側は必ず白色
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If Cells(i, j).Interior.Color <> RGB(255, 255, 255) Then '白色以外のセルに戦闘力を設定
hsMap(i, j) = Int((99 * Rnd) + 1)
End If
Next j
Next i
0372デフォルトの名無しさん
2008/10/01(水) 07:27:04For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If hsMap(i, j) <> 0 Then 'セルに戦闘力が設定されている場合
'そのセルを含め、上下左右のセルの戦闘力の最大値を取得する
hsMaxPow = WorksheetFunction.Max(hsMap(i, j), hsMap(i - 1, j), hsMap(i, j - 1), hsMap(i + 1, j), hsMap(i, j + 1))
If hsMap(i - 1, j) = hsMaxPow Then '上のセルが最大だった場合は、上と同じ色にする
Cells(i, j).Interior.Color = Cells(i - 1, j).Interior.Color
ElseIf hsMap(i, j - 1) = hsMaxPow Then '左のセルが最大だった場合は、左と同じにする
Cells(i, j).Interior.Color = Cells(i, j - 1).Interior.Color
ElseIf hsMap(i + 1, j) = hsMaxPow Then '下のセルが最大だった場合は、下と同じ色にする
Cells(i, j).Interior.Color = Cells(i + 1, j).Interior.Color
ElseIf hsMap(i, j + 1) = hsMaxPow Then '右のセルが最大だった場合は、右と同じ色にする
Cells(i, j).Interior.Color = Cells(i, j + 1).Interior.Color
End If
End If
Next j
Next i
Application.ScreenUpdating = True
Next x
End Sub
0373368
2008/10/01(水) 07:43:19一応貼っときます。
戦闘力はランダムのはずですが、
何故か名古屋が強い気がします・・・
0374デフォルトの名無しさん
2008/10/01(水) 14:08:29フリーズは再現できなかったけどとりあえず軽くしてみた
やったことは
1.色を配列に入れてこねくり回すようにした
2.色が変化しない時は再設定しないようにした
3.気に入らなかったのでElseifをSelect Caseにした
0375374
2008/10/01(水) 14:08:53Sub CommandButton1_Click()
Randomize
Dim hsXmax As Integer 'マップの横最大値
Dim hsYmax As Integer 'マップの縦最大値
Dim hsMap() As Integer 'マップの戦闘力格納用配列変数
Dim hsColor() As Long 'マップの色格納用配列変数
Dim hsColor_old() As Long 'マップの色格納用配列変数(比較用)
Dim i As Integer '行番号
Dim j As Integer '列番号
Dim hsMaxPow As Integer '最大戦闘力
Dim x As Integer 'For用
Dim hsCells As Object
hsXmax = Cells(6, 57).Value
hsYmax = Cells(5, 57).Value
ReDim hsMap(1 To hsYmax, 1 To hsXmax)
ReDim hsColor(1 To hsYmax, 1 To hsXmax)
ReDim hsColor_old(1 To hsYmax, 1 To hsXmax)
With Range(Cells(1, 1), Cells(hsYmax, hsXmax))
'シートから色を取得
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
hsColor(i, j) = .Cells(i, j).Interior.Color
Next j
Next i
0376374
2008/10/01(水) 14:10:02Application.ScreenUpdating = False
'マップに戦闘力を設定
'マップの一番外側は必ず白色
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If hsColor(i, j) <> vbWhite Then '白色以外のセルに戦闘力を設定
hsMap(i, j) = Int((99 * Rnd) + 1)
End If
Next j
Next i
hsColor_old = hsColor
'戦闘結果算出
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If hsMap(i, j) <> 0 Then 'セルに戦闘力が設定されている場合
'そのセルを含め、上下左右のセルの戦闘力の最大値を取得する
hsMaxPow = WorksheetFunction.Max(hsMap(i, j), hsMap(i - 1, j), hsMap(i, j - 1), hsMap(i + 1, j), hsMap(i, j + 1))
Select Case hsMaxPow
Case hsMap(i - 1, j) '上のセルが最大だった場合は、上と同じ色にする
hsColor(i, j) = hsColor(i - 1, j)
Case hsMap(i, j - 1) '左のセルが最大だった場合は、左と同じにする
hsColor(i, j) = hsColor(i, j - 1)
Case hsMap(i + 1, j) '下のセルが最大だった場合は、下と同じ色にする
hsColor(i, j) = hsColor(i + 1, j)
Case hsMap(i, j + 1) '右のセルが最大だった場合は、右と同じ色にする
hsColor(i, j) = hsColor(i, j + 1)
End Select
End If
Next j
Next i
0377374
2008/10/01(水) 14:10:48'マップ(シート)に色を反映
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If hsColor(i, j) <> hsColor_old(i, j) Then
.Cells(i, j).Interior.Color = hsColor(i, j)
End If
Next j
Next i
Application.ScreenUpdating = True
Next x
End With
End Sub
0378デフォルトの名無しさん
2008/10/01(水) 15:41:37最初の処理(以下、処理B)でセルを変更しています。
処理Bのときだけ処理Aを走らせないようにしたいのですが、
どうしたらいいでしょうか。
0379デフォルトの名無しさん
2008/10/01(水) 16:09:13Application.EnableEvents = False
かな?
0380デフォルトの名無しさん
2008/10/01(水) 16:31:03まさにそれでした。ありがとうございました。
最初「Application.EnableEvents = False」の一行見たとき意味わかりませんでしたが、
ググッたら使い方でてきて何とかなりました。
ありがとうございました。
0381368
2008/10/01(水) 22:30:32>>374
ありがとうございます。
予想以上に速くなりすぎていて驚きました。
色を配列に入れるところまで考えが至りませんでした。
ところで、戦闘力はランダムのはずなのに勝者に偏りがありすぎます。
いくつかのマップで10戦ずつやってみたところ、
愛知県マップ・・・名古屋9勝、西三河1勝、東三河0勝
「目(上中下の3色)」マップ・・・上9勝、中0勝、下1勝
「田(4色)」マップ・・・左上8勝、左下2勝、右上0勝、右下0勝
という結果で、左上に近いほど強いとしか思えません。
謎です・・・
0382デフォルトの名無しさん
2008/10/01(水) 23:44:27謎でもなんでもないじゃん。
・hsMapの値が整数で0-100程度でしかないから最大値を取るセルが複数できやすい。
・Select Caseで上左の順でチェックしているから上や左が優先されやすい。
つまり、上や左から侵食されやすい傾向があるわけ。
最大値を取るセルが複数ある場合に微妙に優先度を調整するか、
値の変動幅を大きく取って最大値を取るセルが一つになるようにするかってところかな。
0383デフォルトの名無しさん
2008/10/02(木) 05:20:47if dir( 255文字以上のパス ) <> "" then
0384デフォルトの名無しさん
2008/10/02(木) 05:48:56If fs.fileExists(ぱす) = False Then
でいけたかも。他にあれば教えてください。
0385368
2008/10/02(木) 07:45:57それは私も考えました。
それが原因なら、判定の順序を「下→右→上→左」とすれば、
下や右が強くなるはずです。
順序を変えてやってみましたが、
名古屋8勝、西三河2勝、東三河0勝
上7勝、中3勝、下0勝
左上7勝、左下1勝、右上2勝、右下0勝
と、やはり左上に近いほど強いようです。
まあ、10回程度だと偶然偏りができることも考えられますが・・・
0386374
2008/10/02(木) 10:40:57比較する順序ではなく色を入れ替えるタイミングの問題では?
Select Case hsMaxPow
Case hsMap(i - 1, j) '上のセルが最大だった場合は、上と同じ色にする
hsColor(i, j) = hsColor_old(i - 1, j)
Case hsMap(i, j - 1) '左のセルが最大だった場合は、左と同じにする
hsColor(i, j) = hsColor_old(i, j - 1)
Case hsMap(i + 1, j) '下のセルが最大だった場合は、下と同じ色にする
hsColor(i, j) = hsColor_old(i + 1, j)
Case hsMap(i, j + 1) '右のセルが最大だった場合は、右と同じ色にする
hsColor(i, j) = hsColor_old(i, j + 1)
End Select
と更新前の色を入れてやれば少しは改善するかもしれません
0387デフォルトの名無しさん
2008/10/02(木) 14:59:02マクロ入りのファイルを開いても、マクロが実行できません。
VBAを使っていろいろ処理して終了させます。
処理の中では画面更新の抑制やら色々やってます。
マクロを実行したbookを閉じてから、マクロが入った
ファイルを開くと、右クリックで新規ウィンドウ等を
やらない限りは必然的に、既に開いているExcelを使って
ファイルが開かれると思うのですが、そうなるとマクロが
動かないんです。
セキュリティの問題ではなくマクロが無いファイルのような
そんな扱いです。やはり、色々標準の機能を殺しているのが問題で
それが終了しても保持され続けているのが問題なのでしょうか??
0388デフォルトの名無しさん
2008/10/02(木) 15:20:53セキュリティの設定は何になっているんですか?
低になっていてかつApplication.EnableEventsがFalseだった場合
マクロは自動実行されないはずなので何も起きていないだけでは?
0389デフォルトの名無しさん
2008/10/02(木) 20:31:10Range("1:1,3:3").Select
と言うコードが得られますが、
変数を用いて、a行目とb行目を選択する場合には、どのように記述すれば良いのでしょうか。
よろしくお願いします。
0390デフォルトの名無しさん
2008/10/02(木) 20:41:43Dim a As Integer, b As Integer
Rows(a & ":" & b).Select
0391390
2008/10/02(木) 20:45:59Dim a As Integer, b As Integer
a = 1: b = 3
Range(Rows(a).Address & "," & Rows(b).Address).Select
0392デフォルトの名無しさん
2008/10/02(木) 21:42:23for loopの入れ子でループを抜けたいときは
gotoするのが一般的なんでしょうか?
gotoってあんまり使うなと言われているので
For intI = 3 To 65535
For intJ = 1 To 255
'条件が一致すればここからいっきに2つのループを抜けたい
Next intJ
Next intI
あとループ変数って単純にi,j,kとするか
なにかしらわかりいい名前をつけるのかどちらがいいのでしょうか
よろしくお願いします。
0393デフォルトの名無しさん
2008/10/02(木) 21:48:27(無論そのための仕組みが存在する言語なら話は別だが)
ループ変数はi, j, kとするのが単純かつ分かりやすい。
intIですらやめてくれと言うところだ。
0394デフォルトの名無しさん
2008/10/02(木) 22:11:03ありがとうございました
0395デフォルトの名無しさん
2008/10/02(木) 22:40:28プログラムが大きくなってくると1文字の変数は探しにくい
やりたいことにもよるだろうが
1文字で済ませる癖は付けないほうがいいと思う
0396デフォルトの名無しさん
2008/10/02(木) 23:09:51それはプロシージャを分割した方がいいんじゃないかな
0397デフォルトの名無しさん
2008/10/02(木) 23:23:45標準モジュールの違いがいまいちわからん
クラスはオブジェクトとして使ったりコンパイルしてDLLとして参照すると
名前でプロシージャーを呼び出せるってことなのか?
標準だと他のモジュールのって呼び出せない?
0398デフォルトの名無しさん
2008/10/02(木) 23:39:33union(rows(a),rows(b)).Select
0399368
2008/10/02(木) 23:51:05ありがとうございます。
強さが均等になりました。
言われてみれば、あのプログラムでは左上が強くなるのも当然ですね。
実は、初期はちゃんと古いマップから色を持ってきていたのですが、
高速化のためにいろいろやっているうちに、古いマップを省略してしまったようです。
0400デフォルトの名無しさん
2008/10/03(金) 00:02:25ループ自体をForで探せばいいじゃない。
あと、ループ変数をi, jとしないなんてVB以外では聞いたことないってただの個人的経験だけど。
0401デフォルトの名無しさん
2008/10/03(金) 09:05:00VBA分野の話じゃないね、スレ違い
0402デフォルトの名無しさん
2008/10/03(金) 09:26:222重ループ脱出はForとDoを併用するのが常套手段
For intI = 3 To 65535
Do Until intJ = 255
Exit For
Loop
Next intI
0403デフォルトの名無しさん
2008/10/03(金) 19:39:080404デフォルトの名無しさん
2008/10/03(金) 20:28:55それは無い
0405デフォルトの名無しさん
2008/10/03(金) 22:13:12例えば、
for i = 1 to 100
if cells(i,1).value like "hoge" then
set cl = cells(i,1)
end if
next
のような形で、該当する最初のセルに処理をした時点でループを抜けるにはどのように記述すれば良いのでしょうか。
上記だと2つ以上の該当があった場合、後のセルがsetされてしまいます。
0406>401
2008/10/03(金) 23:22:310407デフォルトの名無しさん
2008/10/03(金) 23:40:02セルをセットした後にExit For
0408デフォルトの名無しさん
2008/10/04(土) 00:55:23自宅にパソがないので平日会社で試すしか方法がないのですが、何枚かのエクセルファイルを開きセルA6に別の表から拾った値を引っ張ります
これがシートならば全シートを選んでVLOOKの式でもA6に入れればいいのでしょうが各ファイルを別々に保存しなければなりません
一度一つのファイルにまとめて入力後またばらしてもいいのですがそれならファイルを開けて手入力する手間とさほど変わりません
多くて40ファイルです
どうぞよろしくお願いしますm(_ _)m
0409デフォルトの名無しさん
2008/10/04(土) 01:25:38その情報だけだと使えそうな手段は2つくらいしか思いつかない
1.VBAで表をまとめてLOOKUP
2.VBAで該当する値を直接取りにいく
>一度一つのファイルにまとめて入力後またばらしてもいいのですが
何がしたいのかよく分からないw
>ファイルを開けて手入力する
これは目視で値を確認していって該当する値を移すってことでしょうか?
>多くて40ファイルです
40ファイル見るだけなのかすべて更新するのかどちらでしょうか・・・
0410デフォルトの名無しさん
2008/10/04(土) 01:47:52おそらくあまりに初級なので難しく捕らえていらっしゃるかもしれません
見に行く表にはA列に番号(12桁)B列にも番号(9桁)がありこれが多くても40種の意味です。重複はしていない番号ばかりです
そしてA列の番号がファイル名にもなっている1枚シートしかないファイルのセルA4に先程の12桁が入っているがセルA6に今までは手入力で9桁番号を入れていました
目視です。一応FIND窓で捜しはします…
独立させずシートとしてまとめたら一度に処理できるかと考えたのですが、、
0411デフォルトの名無しさん
2008/10/04(土) 02:00:03なお40種は40行の意味です
0412デフォルトの名無しさん
2008/10/05(日) 09:52:11横レスします。
状況を私なりに解釈し、不足するところをおたずねします。
1 参照元ファイル(以下ブックと呼びます)は最大40個ある
(408の下から2行目の記述から)
2 参照元ブックにはそれぞれ40行×2列(A列、B列)のデータがある
(410の上から3行目の記述と411の「40種は40行」の記述から)
3 (結果を求める)作業用ブックのA4セルに12桁の番号が入っている
(410の上から4行目の記述)
4 作業用ブックのA6セルには今まで9桁番号を手入力していたが → これを自動で表示させたいってこと?
質問
Q1 上の解釈でいいんでしょうか?
Q2 40個のブックはそれぞれシートは何枚ですか? 1枚ずつだったら40シートの1ブックにまとめられませんか?
0413デフォルトの名無しさん
2008/10/05(日) 12:46:49まず参照元と作業用の違いを私自身があまりわかってないかもしれません。携帯からのカキコで字数が限られ申し訳ないです(>_<)
@A→参照する表は1ブックでそこに多くて40行2列、少ない時は10行2列くらいの表が1シートだけに表記してあります
BC→OKです
Q2→確かにひとつのブックにまとめればいいのですが、保存が1ブック1シートでないといけないのです(請求書みたいな感じ)
なおかつそのブック名もセルA4の番号をつけないといけません
15ブックくらいなら目視&手入力でもいけますが日によって30-40ブックとなると間違いや画面の一杯さで
頭がくらくらしてしまい、楽な方法がないかとお尋ねしてみました
まだ言葉足らずかと思いますがどうぞよろしくお願いいたします
0414デフォルトの名無しさん
2008/10/05(日) 14:25:37やりたいことの自分なりの稚拙な解決方法を思いつくのだが、その具体的なやり方がわからずに
ぐだぐだと質問&回答を続ける。
良い質問方法:
やりたいことをまず具体的に書く。やりたいことというのは、ユーザレベルでの話し。
0415デフォルトの名無しさん
2008/10/05(日) 15:03:16やりたい事は毎日新たに発生するブックのセルA6に、セルA4に対応した9桁の番号を拾ってきて自動入力し保存するという事です
セルA4に対応した番号は他のブックに見に行きます
この表現ではどうでしょうか? あまりに簡単な作業かもしれませんが良い方法があればよろしくお願いします
0416デフォルトの名無しさん
2008/10/05(日) 16:11:49商品マスタ(Product.xls)と注文ブック(Order.xls)ということにして、仕様を書いてみた。
[前提]
1.Product.xlsのSheet1のA:B列に何らかのデータが入力されている
2.毎日Excel Bookが40ファイル程度できる
3.そのBook名は[12桁の文字列].xls(以降、Order Bookと表記)
4.Order Bookには1シート(以降、Orderシート)しか存在せず、そのシートのA4には[12桁の文字列]が設定されている
[やること]
1.毎日発生するOrder BookのOrderシートのA6に、Product.xlsから取得したデータを設定し上書き保存する
2.データの取得方法は、Product.xlsのSheet1!A列の中から、[12桁の文字列]を探し、適合する
行が合った場合は対応するB列の値を持ってくる
[異常処理]
1.Order Book名とA4の内容が異なる場合は***する
2.[12桁の文字列]が見つからなかった場合は***する
[疑問]
>多くて40行2列、少ない時は10行2列
これはどのタイミングでどのような理由で変更されるのか?
0417デフォルトの名無しさん
2008/10/05(日) 16:16:17お前が超絶難しいと思ってるものでも、ソルバ一発で解決できる類の問題もあれば、
単純作業を自動化するだけなのに、プログラム的にはすげー面倒な場合もある。
0418デフォルトの名無しさん
2008/10/05(日) 17:42:54それで1点、OrderBook名には「請求書M...」みたいにセルA4に日本語が3文字ついていたかもしれません
また、10コか40コかはメール受信によって左右されます。メールの添付をどこかのフォルダに保存し何等かのマクロを実行するとよそにそれに対応した9桁の番号が、
検索されるのか作成されるのかするのでそれを本日分として拾ってくるわけです。でセルA6は空白なので入力して完成させる…
自分は記録マクロしかできないのですが、もし自分がVBAに詳しければ@OrderBookのシート1を一つのブックにまとめる
AProductシートもそこに挿入BVlookupでセルA6に値入力Cシートをばらして保存
とかが簡単に出来るのかな?のイメージでした;ω;
スミマセン
0419412
2008/10/05(日) 17:49:34もう一回自分なりに解釈したものを書きます。
1 参照元ブック(1シート)は日々内容が変わるけど、A列、B列にデータが記録されている。
(内容が固定されていないということは413の「多くて40行2列、少ない時は10行2列くらいの表が」から推測)
2 結果を求める(作業用)ブックは複数生まれる
(413の「保存が1ブック1シートでないといけない」ということと、
「15ブックくらいなら目視&手入力でもいけますが日によって30-40ブックとなると」から推測)
3 作業用ブックは「ひな型」となるものを呼び出してA4セルに12桁の番号を入力し、A6セルには参照元
ブックから自動参照した結果が表示されたところで「12桁の番号」をブック名として名前を付けて保存する
4 上記3を15〜40回繰り返す
これでいいのかな?
もし、参照元ブックの名前が固定されているんであればVBAじゃなくてもできそうだけど。
作業用ブックのひな型のある範囲に参照元ブックのデータをまるごと外部参照でもってきておいて、
A6セルにVLOOKUP関数を書いたらいいんじゃないかな。
外部参照って言い方が正しいのかわからないけど、ヘルプで
「ほかのブックやアプリケーションへのリンクを設定する」を見てみてください。
0420412,419
2008/10/05(日) 17:50:560421デフォルトの名無しさん
2008/10/05(日) 18:16:273.の行程上でセルA4には12桁の番号が既に入った状態で届きます。こちらで入力はしません
VLOOKもいいのですが作業用ブックの開け閉めが面倒いというか少ない時はいいのですが、多い時にはどれがどれやらわからなくなるのです
■ このスレッドは過去ログ倉庫に格納されています