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)
0170デフォルトの名無しさん
2008/09/08(月) 19:41:350171デフォルトの名無しさん
2008/09/08(月) 20:08:18循環参照になってる
0172デフォルトの名無しさん
2008/09/08(月) 20:09:260173y
2008/09/08(月) 20:21:47セルB1にあるアドレスを、セルA1にハイパーリンクとして埋め込むのは、
次のようにすればできます。
Sheet1.Hyperlinks.Add Anchor:=Cells(1, "a"), _
Address:=Range(1, "b"), _
TextToDisplay:=Cells(1, "a").Value
(マクロの記録を使って、ハイパーリンクを埋め込む動作を記録してみれば簡単です)
これをループで括って、「1」となっているところ(これは行番号にあたります)を
変えていけば、お好みの行数分操作できます。
0174y
2008/09/08(月) 20:25:13169はマルチポストだったんですね。
気づかずに答えてしまいました。
>>169
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9D%E3%82%B9%E3%83%88
一度ここを読んでおいてください。
0175デフォルトの名無しさん
2008/09/08(月) 20:29:35?
0176y
2008/09/08(月) 20:29:41Address:=Range(1,"b") → Address:=Cells(1,"b")
0177169
2008/09/08(月) 21:03:00ツール→マクロ→VBA→標準モジュールに保存した後、
マクロ実行してみたけどできません。
初心者なんでもう少し詳しく教えていただけませんか?
0178169
2008/09/08(月) 21:54:01行数分操作ができません。
Cells(1, "a"),
1の部分の範囲指定はどうすればいいの?
0179169
2008/09/08(月) 21:55:21一括で変更できると助かります
0180デフォルトの名無しさん
2008/09/08(月) 22:01:320181デフォルトの名無しさん
2008/09/08(月) 22:27:39いろいろ調べてもわからねぇよ
質問スレなんだから聞いてるんだろ。。意地悪しねぇで教えろよ。
その気がないなら返信するな
0182デフォルトの名無しさん
2008/09/08(月) 22:45:30な
0183デフォルトの名無しさん
2008/09/08(月) 22:46:160184デフォルトの名無しさん
2008/09/08(月) 23:16:260185デフォルトの名無しさん
2008/09/08(月) 23:40:480186デフォルトの名無しさん
2008/09/08(月) 23:43:520187デフォルトの名無しさん
2008/09/09(火) 01:33:11「XML入門」みたいな本はたくさん見るんですけど、あれって具体的なコーディングについては記述が無いorごく少ないですよね。。。
あってもPHPとかばっかりだし。。。
0188デフォルトの名無しさん
2008/09/09(火) 08:48:08まともな頭があればVBAでCOM(XMLDOM)使ってXML扱うくらい、
ネットの情報だけで事足りる
0189デフォルトの名無しさん
2008/09/09(火) 10:31:32↓のを作ったのですが、出来ません。どうすればいいですか?
SOLVERの参照設定はやりました。
Sub Macro1()
Dim x As Integer
For x = 1 To 5
Range("Cells(x, 3)").Select
SolverOk SetCell:=Cells(x, 5), MaxMinVal:=3, ValueOf:="0", ByChange:=Cells(x, 2)
SolverSolve Userfinish:=True
Next x
End Sub
0190y
2008/09/09(火) 19:35:50173の後半を、もう少し具体的に書きます。
まずループ用の変数rを宣言し、ここでは例として
For 〜 Next間を5回繰り返すループを示しておきます。
Dim r as Long
For r = 1 to 5
Sheet1.Hyperlinks.Add Anchor:=Cells(r, "a"), _
Address:=Cells(r, "b"), _
TextToDisplay:=Cells(r, "a").Value
Next
繰り返しのたびに、rは1, 2, 3, 4, 5と変化していくので、
上のコードでは1〜5行目に対する操作が行われることになります。
初心者の方なら、「VBA デバッグ」などで検索してみて、この過程を
一つ一つ目で確認する方法を身につけると、上達が早くなります。
For r = Inputbox("開始行?") to InputBox("終了行?")
とすれば、処理をしたい行の範囲を簡単に指定できますが、
もっと便利にしたければ、自分でも他の方法を色々調べてみてください。
質問する時は、どんなに間違っていてもいいので、とにかく何か自分なりに
調べて考えたコードを貼って、それに対するアドバイスを求めた方がいいですよ。
181のようなことを書くと、>>1の★5にあるように、「また丸投げか」と
怒りを買ってしまいます。
0191y
2008/09/09(火) 20:01:47マクロの記録を使って、ソルバーでやりたい作業をマウスでやってみて、
どんなコードが記録されるか確かめてみてください。(>>1★5)
189のコードについては、
@単純な構文ミス Range("Cells(x, 3)").Select → Cells(x, 3).Select
A目的セルをどこにしたいのか、可変セルをどこにしたいかが不明
です。特に、Aが分からないとアドバイスができません。
0193デフォルトの名無しさん
2008/09/09(火) 20:44:23ご親切にありがとうございました。
勉強になりました
0194デフォルトの名無しさん
2008/09/09(火) 22:41:34すみません
目的のセルがCells(x, 5)で、可変セルがCells(x, 2)のつもりでした。
で、@のやつをやったら出来ました。
ありがとうございました。
0195デフォルトの名無しさん
2008/09/09(火) 22:50:31何か作ろうと思うのですが…自分では思いつかないので…
何か問題お願いします。
0196デフォルトの名無しさん
2008/09/09(火) 22:57:53このスレを集計してyの貢献度を調査せよ。
0197195
2008/09/09(火) 23:04:59ラジャ
0198デフォルトの名無しさん
2008/09/09(火) 23:34:22A列には文章が入っています。
B列には文章に含まれる単語、C列にはコード番号が入っています。
それぞれ数百〜数千行になります。
A列にはB列の単語のいずれかが含まれる場合には、
単語に対応するC列のコードをD列に表示させたいのですが、
どのような式がよいでしょうか。
VLOOLUPやFINDなどを組み合わせてみても上手くいきません。
お手数ですが、どなたか至急お教え願えますでしょうか。
0199デフォルトの名無しさん
2008/09/10(水) 00:31:40このスットコドッコイ
0200デフォルトの名無しさん
2008/09/10(水) 07:26:43B列…デフォルト、セル、スットコドッコイ
C列…E46194、H23t55、342421
0201デフォルトの名無しさん
2008/09/10(水) 07:44:070202デフォルトの名無しさん
2008/09/11(木) 00:16:48c:\aaa 配下にある全てのファイルとサブフォルダを
c:\bbb 配下に全てコピーする事は可能ですか?
また、サンプルコード等ありましたらヒントを頂けると助かります
色々と探してはいるのですが、いまいちピンとこないので
サンプルがあると助かるのですが、、、、
VBAはまだまだ初心者なので未熟者で恐縮です。
0203デフォルトの名無しさん
2008/09/11(木) 06:12:54>>1★3 ★4
0204デフォルトの名無しさん
2008/09/11(木) 19:30:310205デフォルトの名無しさん
2008/09/11(木) 19:59:47AddItemで追加した後にシートを
Xボタンを押して閉じようとすると
変更を保存しますかと聞かれるんですが
このチェックを外す方法ってあります?
OSはXPでExcel2003です。
0206y
2008/09/11(木) 20:15:03文章中の、特定の単語の有無の判定なら、たぶんInStr関数で何とかなると思います。
調べてみて使えそうなら使ってください。
>199にもありますが、具体的なデータが分からないとアドバイスしずらいです...
0207y
2008/09/11(木) 20:17:20どんな業界で働いている方か分かりませんが、
実務に役立つ知識が増すようなテーマを選ぶと、
何かと都合がいいのではないでしょうか。
為替、株式市況、地価、青果水産物市況など、
ネット上にはたくさんの生データが公開されています。
それらを自動的に取得し、テーマに沿って演算し、
レポートを出力するマクロを組むだけでも、
相当勉強になると思います。
やるのであれば、日々刻々と変化する数字の方が面白いです。
例えばある人は、東京に10数箇所ある中央卸売市場の毎日の市況データを
取得し、各市場の卸売価格差をグラフに出力するマクロを作っていました。
仲買業者なら、どこの市場で買い付けをすれば一番安いか、
逆に生産者なら、どこの市場に出荷すれば一番高いか、
一目で分かるというものです。ちなみに彼は商社に勤めていますが、
似たようなことをしている人は結構いるでしょう。
Excelは基本的にデータ処理の道具なので、何を試すにしても、
まずは題材になるデータを見つけてこなければなりません。
ならば自分が、分析対象として最も興味を覚えるデータを選ぶのがベターです。
その上で、自分のスキルに応じた試行錯誤をしてみればいいと思います。
仮に「VBA解説書に載っている多機能な家計簿を作るんだ」と決意したとして、
自分で小遣い帳をつけているほどの人ならともかく、付属CDに入っている
仮想データを使って作っていくようなやり方は、モチベーションが湧きづらい
ように感じます。
0208デフォルトの名無しさん
2008/09/11(木) 22:02:380209デフォルトの名無しさん
2008/09/11(木) 23:07:26×しずらい
○しづらい
◎しにくい
0210デフォルトの名無しさん
2008/09/12(金) 01:38:18WindowsVBAつくってよ
0211デフォルトの名無しさん
2008/09/12(金) 03:36:310212y
2008/09/12(金) 20:05:30「シートを Xボタンを押して閉じようとすると」とありますが、
シートに×ボタンはないので、たぶん「ブックを」のつもりでしょうか。
「変更を保存しますか」というメッセージは、ブックを保存した直後の状態であれば
表示されません。この状態は、WorkbookオブジェクトのSavedプロパティをTrueに
することで、強制的に作り出すことができます。
ブックが閉じられる直前に、その操作が自動で行われるようするためには、
ThisWorkbookオブジェクトのコード領域にBeforeCloseイベントを挿入し、
その中でSavedプロパティを操作します。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Saved = True
End Sub
0213デフォルトの名無しさん
2008/09/12(金) 20:44:060214デフォルトの名無しさん
2008/09/12(金) 20:51:26お前がな
0215205
2008/09/12(金) 22:35:11ありがとうございました。
0216デフォルトの名無しさん
2008/09/13(土) 00:10:190217y
2008/09/13(土) 02:54:400218デフォルトの名無しさん
2008/09/13(土) 03:49:120219デフォルトの名無しさん
2008/09/13(土) 06:49:480220デフォルトの名無しさん
2008/09/13(土) 07:14:090221デフォルトの名無しさん
2008/09/13(土) 08:56:370222デフォルトの名無しさん
2008/09/13(土) 09:06:33嫌ならNGしとけ。
0223デフォルトの名無しさん
2008/09/13(土) 09:25:580224デフォルトの名無しさん
2008/09/13(土) 10:01:340225デフォルトの名無しさん
2008/09/13(土) 11:55:22だけど、挿入する行をセルの値から指定したい場合はどうすればよいですか?
例
B2 = 3
3行目と4行目の間に行挿入をするようB2をつかってさせる。
0226デフォルトの名無しさん
2008/09/13(土) 13:16:55i = Range("B2")
Rows(i).Insert
0227デフォルトの名無しさん
2008/09/13(土) 13:18:30Rows(Range("B2")).Insert
0228デフォルトの名無しさん
2008/09/13(土) 14:07:04助かります、ありがとうございました。
0229y
2008/09/13(土) 16:13:470230デフォルトの名無しさん
2008/09/13(土) 22:03:030231デフォルトの名無しさん
2008/09/13(土) 22:16:440232デフォルトの名無しさん
2008/09/13(土) 22:33:410233デフォルトの名無しさん
2008/09/13(土) 23:38:260234デフォルトの名無しさん
2008/09/14(日) 00:06:420235デフォルトの名無しさん
2008/09/14(日) 03:08:08また、工事管理を行っていて、工期の数日前になると警告文が出るようにできるのでしょうか?
0236デフォルトの名無しさん
2008/09/14(日) 05:20:37「シートに画像をドラッグした時に」というイベントが用意されてないから、
「ドラッグした」ら自動で処理するってのは無理
「シートに画像をドラッグしてからボタンを押したら」なら可能だが
> また、工事管理を行っていて、工期の数日前になると警告文が出るようにできるのでしょうか?
可能だがExcelでやるべきことじゃないな
Excelでやるってことは、Excelとその警告マクロを作ったブックを立ち上げてないと警告文出ないわけだし
やるとすれば、「n日前」ではなく、「n日前以降、最初にExcelを立ち上げたとき」という条件になるかな
0237デフォルトの名無しさん
2008/09/14(日) 16:10:42後者:できない
0238デフォルトの名無しさん
2008/09/14(日) 17:37:16あいうえお(abc)
かきくけ(ほげほげ)
さしすせそたちつ(nekdk)
という行がありまして、()とその中の文字列だけを全部消したいです。
()は全角です。()内の文字、文字数数がことなるので置換が使えないでいます。。
0239デフォルトの名無しさん
2008/09/14(日) 18:02:250240デフォルトの名無しさん
2008/09/14(日) 18:10:17>>1 ★2
0241デフォルトの名無しさん
2008/09/14(日) 21:03:02関数ではないけど
ツール→区切り位置で区切り文字を ( にすると
( の前後で別のセルに分かれるからそれではダメかな?
0242デフォルトの名無しさん
2008/09/14(日) 22:58:50行き詰ってしまったので何かアドバイスをいただければと思います。
OSはXPでエクセルのバージョンは2002です。よろしくお願いします。
ブック内に「メイン画面」「情報A」「情報B」という3つのシートがあります。
「メイン画面」のB5セルに会員番号(K_Ban)を入力してマクロを実行すると「情報A」「情報B」から該当の会員番号に関する情報が「メイン画面」の任意のセルに代入されるというものです。
ただし「メイン画面」の形式の都合で、該当する「情報A」のうち、上から3件のみを出力させて4件目以降はカットしています。(下記コード参照)
「情報B」は「種別」という項目があり、「野菜」「肉類」「魚類」…などの分類が30種類ほどあります。
「情報B」についても、各種別毎に3件目以降はカットしたいのですが、行き詰っています。
すなわち、会員番号1について「情報B」は30件あり、野菜25件、肉類5件があるとすると
「メイン画面」には野菜3件、肉類3件分の情報を出力させたいのです。
また、種別については、今後随時変更があるので「種別毎に変数を設定して直接数える」のではないようなコードにしたいと思っています。
0243デフォルトの名無しさん
2008/09/14(日) 23:00:25Dim K_Ban As String
Dim MyRange As Range
Dim MyAddress As String
Dim cnt As Integer
K_Ban = Worksheets("メイン画面").Range("B5")
Set MyRange = Worksheets("情報A").Range("A1:A50").Find(K_Ban, LookAt:=xlWhole)
MyAddress = MyRange.Address
cnt = 8
Do
Worksheets("メイン画面").Cells(cnt, 3) = MyRange.Offset(0, 0).Value
Worksheets("メイン画面").Cells(cnt, 4) = MyRange.Offset(0, 1).Value
Worksheets("メイン画面").Cells(cnt, 5) = MyRange.Offset(0, 2).Value
cnt = cnt + 1
If cnt = 11 Then
Exit Do
End If
Set MyRange = Worksheets("情報A").Range("A1:A50").FindNext(MyRange)
Loop Until MyRange.Address = MyAddress
End Sub
0244デフォルトの名無しさん
2008/09/14(日) 23:25:440245デフォルトの名無しさん
2008/09/15(月) 08:41:270246y
2008/09/15(月) 11:18:44|A列. |B列. |C列. |D列. |E列.
01 | 0123456789| .| .| .|
02 | .| .| .| .|
03 | .| .| .| .|
04 | .| .| .| .|
05 | .| .| .| .|
シート内のデータ内容を説明するために、以前こんなテンプレを使っている人がいました。
「情報A」「情報B」シートの中身を、文章で説明するより楽だと思ったら使ってください。
0247242
2008/09/15(月) 13:54:22以下のようなシート構造で、種別→日付で並べ替えてあります。
A B C D
番号 種別 データ1 データ2
1 肉類 豚肉 20080915
1 肉類 牛肉 20080912
1 肉類 鶏肉 20080801
1 魚類 その他 20080401
2 肉類 猪肉 20080905
2 野菜 その他 20080802
0248y
2008/09/15(月) 16:03:53Sub Sample()
Dim K_Ban As Long: K_Ban = Worksheets("メイン画面").Range("B5")
Dim r As Long
Dim shubetsu As String
Dim shubetsuCnt As Integer
With ThisWorkbook.Sheets("情報B")
.Range(.Cells(1, 1), .Cells(.Rows.Count, 4).End(xlUp)).AutoFilter Field:=1, Criteria1:=K_Ban
r = 2
Do While .Cells(r, 1) <> ""
If .Rows(r).Hidden = False Then
If shubetsu <> .Cells(r, 2) Then
shubetsu = .Cells(r, 2)
shubetsuCnt = 1
ElseIf shubetsuCnt < 3 Then
shubetsuCnt = shubetsuCnt + 1
Else
.Rows(r).Hidden = True
End If
End If
r = r + 1
Loop
.Range(.Cells(2, 1), .Cells(.Rows.Count, 4).End(xlUp)).SpecialCells(xlCellTypeVisible).Copy _
Destination:=ThisWorkbook.Sheets("メイン画面").Cells(8, 3) '←任意のコピー先セル
.AutoFilterMode = False
End With
End Sub
0249y
2008/09/15(月) 16:04:42「メイン画面」の任意のセルにコピーする、という考え方です。デバッガでステップ実行していけば、
不要な行が非表示になっていく様子がよく分かると思います。不便なところは改良してみてください。
なお、データは「種別→日付で並べ替えてあります」とありますが、見たところ「番号→種別→日付」で並んで
いますね。上のコードは、そう並んでいる必要があります。
他のやり方を提案する方もいるかもしれませんので、そちらも参考にしてください。
0250デフォルトの名無しさん
2008/09/15(月) 18:09:00C3で指定した値の行に行を挿入して、D3,Fj,D3で与えた値を挿入した行のHi、Fi,Iiに値を入れたいのですが、どこが間違っていますでしょうか、ご指摘お願いします。
Sub Main
Rows(Range("C3")).Insert
Dim i As Integer
Dim j As Integer
i = Range("C3")
Range("D3").Copy Destination:=Range("Hi")
j = i-1
Range("Fj").Copy Destination:=Range("Fi")
i = Range("E3")
Range("D3").Copy Destination:=Range("Ii")
END SUB
このように作ったのですが、うまくいきません。
0251デフォルトの名無しさん
2008/09/15(月) 18:39:29まず、Range("Hi")というセルの指定のやり方はない
Rangeを使いたいんなら、Range("H" & i )
ほかには、Cells(i, 8)、もしくは、Cells(i, "H")
解説サイトいっぱいあるから基本的とこから少し勉強したほうがいいよ
0252デフォルトの名無しさん
2008/09/15(月) 19:29:45今日これからVBAの勉強を力尽きるまでやってみるぜ。
困ったときはお前らだけが頼りだ。
0253デフォルトの名無しさん
2008/09/16(火) 06:39:12ご指摘、解説ありがとうございます。
出来る限り自分でやるようにしてみます。
0254242
2008/09/16(火) 23:49:49ありがとうございます。
(もしかしたら上級者の方には普通なのかもしれませんが)
自分には全くない発想でした。勉強になりました。
お示しいただいたコードを元に自分でも勉強したいと思います。
0255デフォルトの名無しさん
2008/09/17(水) 00:16:06現によその言語ではそういうことができるものだってある(Perlとか)。
いずれにせよVBAはそういうことをしないということに変わりはないけれど。
0256デフォルトの名無しさん
2008/09/17(水) 01:45:49Microsoft Forms 2.0 TextBoxだと右クリックしてもメニューが出てこないよね。
出てくるようにしたいんだけど、何かいい知恵あるかな?
0257デフォルトの名無しさん
2008/09/17(水) 17:14:061004エラーが出ます。(´Д`;
worksheet記述を加えてみたり、色々試してみたのですが消えません。
作りたいものとしては、
A列を縦にチェックして異なる文字列が出てきたら罫線(太線)を引く、
というものです。
突っ込み、お願いします。
Sub test()
Dim i As Integer
Dim st_flag As Byte
Dim range1 As Range
st_flag = 0
i = 3
Do While Cells(i, 1).Value <> ""
If (st_flag = 1) Then
If (Cells(i, 1).Value <> Cells(i - 1, 1).Value) Then
Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlMedium
End If
Else
st_flag = 1 ''最初の1セルは比較をしない
End If
i = i + 1
Loop
End Sub
0258デフォルトの名無しさん
2008/09/17(水) 19:04:300259デフォルトの名無しさん
2008/09/17(水) 19:37:16↓
Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).Weight = xlMedium
0260デフォルトの名無しさん
2008/09/17(水) 20:29:58Border クラスの LineStyle プロパティを設定できません。
これくらいコピペしようぜ
0261デフォルトの名無しさん
2008/09/17(水) 20:30:380262デフォルトの名無しさん
2008/09/17(水) 20:37:010263デフォルトの名無しさん
2008/09/17(水) 21:21:15すれ違い甚だしい質問だとか煽りだとか
ここはまだまし
0264デフォルトの名無しさん
2008/09/17(水) 21:42:26質問者 回答者 講釈師
貴方はどれに該当しますか?
0265デフォルトの名無しさん
2008/09/17(水) 21:43:550266デフォルトの名無しさん
2008/09/17(水) 21:51:220267デフォルトの名無しさん
2008/09/17(水) 21:52:590268y
2008/09/17(水) 23:26:36念のため補足しますが、>>248のコードは決して最善の方法ではありません。
合致する会員番号でふるいをかけ、その中から種別ごとに最大3つまでの
アイテムを取り出していく取捨選択の過程を、視覚的に理解するために利用してください。
仕組みが単純なので、コードが短くて済むというのが唯一の利点ですが、
マスタデータの行の表示・非表示を切り替えて実現する「検索システム」というのは、
>255でも指摘をいただいていますが、普通はやらないでしょう。
(数がたくさんになると、けっこう動作が重くなってしまいます)
まじめに実装するとすれば、取捨選択の考え方はそのまま生かすとしても、
転記の仕方に改良の余地があります。適当な二次元配列を用意して、
取捨選択したデータを一行ずつ追加していき、最終的に配列ごと任意のセルに
書き込む、というのが一般的なやり方になると思います。
>>256
TextBoxのMouseDownイベントプロシージャ内で、Commandbars("登録されているCommandbar名").ShowPopup を
実行すれば、そのタイミングで表示されます。ユーザー設定のショートカットメニューも表示できます。
ちなみにMouseDownイベント発生時は、Button引数 が 定数xlSecondaryButton と等しければ、右クリックと判断できます。
0269デフォルトの名無しさん
2008/09/18(木) 01:50:36■ このスレッドは過去ログ倉庫に格納されています