Excel VBA質問スレ Pa ..
2:デフォルトの名無しさん
09/07/14 19:09:02
過去スレ
01 スレリンク(tech板)
02 スレリンク(tech板)
03 スレリンク(tech板)
04 スレリンク(tech板)
05 スレリンク(tech板)
06 スレリンク(tech板)
07 スレリンク(tech板)
08 スレリンク(tech板)
09 スレリンク(tech板)
10 スレリンク(tech板)
11 スレリンク(tech板)
3:デフォルトの名無しさん
09/07/14 19:34:28
msgbox ">>1乙"
4:デフォルトの名無しさん
09/07/14 20:17:38
do
msgbox "1乙"
loop
5:デフォルトの名無しさん
09/07/15 07:36:53
dim ポニテ as strlng
ポニテ = ”>>1乙”
debug.print ポニテ
6:デフォルトの名無しさん
09/07/16 08:04:15
Dim これは乙なんかじゃなくてなんたらかんたら
これは乙なんかじゃなくてなんたらかんたら =FileFile
Open "C:>>1乙.thanks1" for output as これは乙なんかじゃなくてなんたらかんたら
Print これは乙なんかじゃなくてなんたらかんたら ,">>1乙"
Close これは乙なんかじゃなくてなんたらかんたら
7:デフォルトの名無しさん
09/07/16 11:50:46
indowsVista
MicroSoftOfficeEXCEL2007
を使っています。
初歩的な質問で申し訳ないのですが、
ユーザーフォームでListBoxを作って
プログラムの中で、
Dim a As ListBox
と宣言して、
Set a = ListBox1
として実行すると、型が一致しません、とエラーがでてしまいます。
どなたかこのエラーの理由がわかる方いましたら
レスよろしくお願いします!
8:デフォルトの名無しさん
09/07/16 12:35:55
>>7
エラーはどこで出てるの? 黄色い矢印はSet a = のところにある?
エラーメッセージは「型が一致しません」で間違いない?
9:デフォルトの名無しさん
09/07/16 12:54:04
>>8
レスどうもです!
エラーメッセージは間違いありません。
黄色い矢印は、標準モジュールに書いたユーザーフォームを表示させる
UserForm.Showの命令に出ます。
ユーザーフォームの初期化部分(UserForm_Initialize()内)で
先ほどの代入文を使っているのですが、
メッセージボックスを使ってバグの場所を特定すると、
その代入文でエラーが起きているようなのです。
何か少しでもヒントがあったら
レスいただければ幸いです。
10:デフォルトの名無しさん
09/07/16 14:29:59
理由は良くわかりませんが、
Dim a As MSForms.ListBox
としなければならないようです。
11:デフォルトの名無しさん
09/07/16 14:47:15
>>10
エラーがなくなりました!
ネット環境がないので助かりました。
どうもありがとうございました!!
12:デフォルトの名無しさん
09/07/16 14:49:36
呼び出し直後でNULL値がセットされてんじゃね
13:デフォルトの名無しさん
09/07/16 21:47:58
VBA初心者です。これをループにしたいときって、どうすればいいんでしょうか?
Sub test()
With ActiveSheet
Sheets("test").Cells(4, 2).Value = .Cells(19, 3)
Sheets("test").Cells(4, 3).Value = .Cells(18, 3)
Sheets("test").Cells(4, 4).Value = .Cells(116, 3)
Sheets("test").Cells(5, 2).Value = .Cells(19, 5)
Sheets("test").Cells(5, 3).Value = .Cells(18, 5)
Sheets("test").Cells(5, 4).Value = .Cells(116, 5)
Sheets("test").Cells(6, 2).Value = .Cells(19, 7)
Sheets("test").Cells(6, 3).Value = .Cells(18, 7)
Sheets("test").Cells(6, 4).Value = .Cells(116, 7) 〜(以下略
End With
End Sub
14:デフォルトの名無しさん
09/07/16 21:48:45
見よう見まねでこんなふうにやってみたら、ダメでした・・・
Sub test()
Dim y As Integer
Dim x As Integer
For y = 4 To 6
For x = 3 To 7 Step 2
With ActiveSheet
Sheets("test").Cells(y, 2).Value = .Cells(19, x)
Sheets("test").Cells(y, 3).Value = .Cells(18, x)
Sheets("test").Cells(y, 4).Value = .Cells(116, x)
End With
Next
Next
End Sub
どなたか、力を貸してください。。。
15:デフォルトの名無しさん
09/07/16 22:32:20
何がどう駄目だったのかぐらい書け
16:デフォルトの名無しさん
09/07/16 22:41:10
Dim row As Integer
With ActiveSheet
For row = 4 To 6
Sheets("test").Cells(row, 2).Value = .Cells(19, 2 * (row - 3) + 1)
Sheets("test").Cells(row, 3).Value = .Cells(18, 2 * (row - 3) + 1)
Sheets("test").Cells(row, 4).Value = .Cells(116, 2 * (row - 3) + 1)
Next
End With
17:デフォルトの名無しさん
09/07/17 00:19:06
>>15
すみませぬ。
y は期待通りにいってくれましたが、x は3のままでした・・・
>>16
おおおー!
こういうことなんですか!
規則性を見つけ出して、変数をひとつで済むようにする!
勉強になりました! 本当にありがとうございます!
18:デフォルトの名無しさん
09/07/17 09:45:03
変数名に既存のメソッドやプロパティと同じ名前をつけるのは関心しない
バグの元
19:デフォルトの名無しさん
09/07/17 14:47:06
それもあるから変数名を日本語でつけることを良くやる
簡易な説明になるしデバッグや拡張に有為
けど慣れてない人とかからはなんで日本語やん言われるんだよな
国内でしか使用しないんだからいいじゃんかよー
20:デフォルトの名無しさん
09/07/17 18:45:40
本末転倒
21:デフォルトの名無しさん
09/07/17 19:58:13
カウントアップ変数は i , j , k , l , m , n にするのが無難だよ。
昔の名残で、今のほとんどの言語では i を見ればカウントアップ変数と分かるしね。
VBA限定の話ならば、 i は row方向、 j は column方向。ってのが多いんでないかな。
22:デフォルトの名無しさん
09/07/17 20:09:14
デクリメント禁止ですか
23:デフォルトの名無しさん
09/07/17 20:15:19
ワークシートの処理で二重ループなら、俺は
For r = …
For c = …
ってやってる。
オートシェイプやグラフ関係ならx, y
セルと関係ないループだとi, j
24:デフォルトの名無しさん
09/07/17 20:21:48
>>22
i--
でデクリメント出来れば文句無いんだけどなあ。
25:デフォルトの名無しさん
09/07/17 22:18:52
素直に step -1で良いやん
26:デフォルトの名無しさん
09/07/18 05:48:09
>>25
いや、インクリメント、デクリメントは人気あるんですよ。
forの場合はstep-1 で下げられるけど、
doの場合は、i = i+1 ってのがどうもしっくり来ないのだ。
i++ が実装されれば素敵だなぁと。
27:デフォルトの名無しさん
09/07/18 07:59:48
Function Inc(x)
Inc = x + 1
End Function
Function Dec(x)
Dec = x - 1
End Function
28:22
09/07/18 10:09:47
「カウントアップ変数」なんて普通言わないよって皮肉が通じなかったかw
29:デフォルトの名無しさん
09/07/18 14:09:06
それは通じないわw
30:デフォルトの名無しさん
09/07/18 14:36:56
エクセル2000を使用しています。
テキストボックスに日付を入力して、コマンドボタンをクリックで
日付の「月」だけを増やすにはどうすればいいですか?
例)
テキストボックスに日付「2009/7/19」を入力
コマンドボタンをクリック
セルA1に「2009/7/19」
セルA2に「2009/8/19」
セルA3に「2009/9/19」
セルA4に「2009/10/19」
セルA5に「2009/11/19」
セルA6に「2009/12/19」
のような結果にしたいです。
よろしくお願いします。
31:デフォルトの名無しさん
09/07/18 17:40:02
excel 2002 です。
Sheet 1 の Cells(1, 1) 〜 Cells(1, 10) を、Sheet 10 の Cells(1, 1) 〜 Cells(10, 1)に
Sheet 2 の Cells(1, 1) 〜 Cells(1, 10) を、Sheet 10 の Cells(11, 1) 〜 Cells(20, 1)に
Sheet 2 の Cells(1, 1) 〜 Cells(1, 10) を、Sheet 10 の Cells(21, 1) 〜 Cells(30, 1)に
という処理をループでやりたいんですが、うまい処理が思いつきません・・・
ご助力お願いします。
32:デフォルトの名無しさん
09/07/18 17:55:46
>>31
3番目はSheet3の誤植とみなして
For i = 1 to 3
For j = 1 To 10
WorkSheets("Sheet10").Cells(i * 10 + j - 10, 1) = WorkSheets("Sheet" & i).Cells(1 , i)
33:デフォルトの名無しさん
09/07/18 17:56:45
制御変数
ループ制御変数
カウンタ
カウンタ変数
好きなのを選べ
34:デフォルトの名無しさん
09/07/18 17:58:43
一番最後の i は j の間違い
あと、「Sheet1」じゃなくて「Sheet 1」なの?
WorkSheets("Sheet 10").Cells(i * 10 + j - 10, 1) = WorkSheets("Sheet " & i).Cells(1 , j)
35:デフォルトの名無しさん
09/07/18 18:01:32
カウンタ変数に一票
36:デフォルトの名無しさん
09/07/18 19:53:10
エクセル2003で、VBAでワークシート関数としてMID関数は使えますか?
「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」って出てしまうんですけど
37:デフォルトの名無しさん
09/07/18 19:57:12
>30
質問:
ユーザーフォームを使う必要がありますか?シートのどこかのセルに日付を入れて、
シートのどこかに置いたボタンじゃだめですか?(一応フォーム前提でちょっと検討中
ではあるけど)
コマンドボタンクリック1回で、どこまで日付を生成したらいいんですか?
それとも、コマンドボタンをクリックする都度1行ずつ下に日付を出力するんですか?
その場合は、どの行まで出力したかを記憶しておく変数の保存場所がシートのどこか
もしくはユーザーボックスのテキストボックス(日付を入れるものとは別)に書き込ん
でおく必要があります。どういう方法がいいですか?(マクロで保持できるのかな?)
38:デフォルトの名無しさん
09/07/18 20:26:48
>>37
いい人ですね、ありがとうございます。無い頭使って下記のようになりました。
textbox1に日付を入力します。
sheet4のi列に月、j列に日を抜き出してc列に日付を入力するように対応しました。
テキストボックスに入力した月から12月までをシートに書き出したいんですが、、、
d = MsgBox("入力しますか?", vbYesNo,)
If d = vbYes Then
y = TextBox1.Value
i = DatePart("m", y)
m = DatePart("d", y)
j = 11 - i
With Worksheets("sheet4")
.Range("f65536").End(xlUp).Offset(0, 3) = i
.Range("f65536").End(xlUp).Offset(0, 4) = m
.Range("c65536").End(xlUp).Offset(1, 0) = i & "月" & m & "日"
End With
For k = h To j
q = Worksheets("sheet4").Range("i65536").End(xlUp)
With Worksheets("sheet4")
.Range("f65536").End(xlUp).Offset(0, 3) = q + 1
.Range("f65536").End(xlUp).Offset(0, 4) = m
.Range("c65536").End(xlUp).Offset(1, 0) = q + 1 & "月" & m & "日"
End With
Next
Else
ユーザーフォームは必須です。
他にいい方法があればお願いします。
39:デフォルトの名無しさん
09/07/18 20:28:28
>>36
i = WorksheetFunction.Mid(a, b, c)
とは
i = Mid(a, b, c)
こうかけるけど、
F2で検索してもワークシート関数としてのMidは引っかからなかった。
あえてワークシート関数として使うことは無理かと。
40:デフォルトの名無しさん
09/07/18 20:30:37
>>39
!!そんなシンプルでよかったんですね
助かりました。ありがとうどざいます。
41:38
09/07/18 20:31:35
読み難くて申し訳ないです。
抜けがありました。
h = Worksheets("sheet4").Range("c65536").End(xlUp).Offset(1, 0)
42:デフォルトの名無しさん
09/07/18 20:40:09
>>34
できました! ありがとうございます!
Sheet名は、おっしゃる通りです。また、Sheet1, 2, 3 と書くつもりが 1, 2, 2 とやってしまいました・・・ 意図を汲んでいただき、本当に感謝しています。
ネストというのは、こういうふうに使うものなんですね。もっといろいろ精進します!
43:デフォルトの名無しさん
09/07/18 21:36:45
優しいエスパーが多いな、このスレ w
44:37
09/07/18 21:44:39
>30,38
日付をyyyy/m/d形式でテキストボックスに入力するという前提で作って見ました。
ユーザーフォームのコマンドボタン1のスクリプトです。
Option Explicit
Private Sub CommandButton1_Click()
Dim ary_date As Variant
Dim tate As Long, tuki As Integer
ary_date = Split(UserForm1.TextBox1, "/")
If UBound(ary_date) <> 2 Then ' 要素が3個あるか
GoTo ERR_PROC
End If
tate = ActiveSheet.Range("C65536").End(xlUp).Row + 1 '出力開始行
On Error GoTo ERR_PROC
For tuki = ary_date(1) To 12
ActiveSheet.Cells(tate, 3).Value = _
DateValue(ary_date(0) & "/" & tuki & "/" & ary_date(2))
tate = tate + 1
Next tuki
Exit Sub
ERR_PROC:
MsgBox ("日付が正しくありません")
End Sub
以上
splitコマンドで日付データから年、月、日の3要素を一度に配列に格納できて便利です。
45:30
09/07/18 22:08:54
>>44
確認しました。
コードの意味がよく分からないので理解できるまで調べてみます。
ありがとうございました!
46:30,44
09/07/18 22:26:25
>45
おことわり・・・当方Excel2003なので、ひょっとすると不具合がでるやもしれません。
バージョン2000と2003のVBAの機能の違いについてはよくわかりません、あしからず。
それから、テキストボックスに入力した文字列が日付として正しいかどうかはチェック
してません。
また、「月」だけを単純に増やしていくと、月末の違いで途中で「日付が正しくない」
と表示して終わる場合があります。(9月や11月に31日は存在しない)
47:30
09/07/18 22:39:03
>>46
親切にどうもです。
テキストボックスは入力制限してあるので大丈夫です。
>>44のコードを理解して幅が広がれば、と思います。
ありがとうございました。
48:30
09/07/18 22:42:58
>また、「月」だけを単純に増やしていくと、月末の違いで途中で「日付が正しくない」
>と表示して終わる場合があります。(9月や11月に31日は存在しない)
これ盲点でした。。
ちょっと考えてみます。
49:デフォルトの名無しさん
09/07/19 00:46:11
>>38
Dim DateInputRange As Range, d%, i&
On Error Resume Next
d = MsgBox("入力しますか?", vbYesNo)
If d = vbYes Then
'入力判定
If Not IsDate(TextBox1.Value) Then
MsgBox "節子!それ日付と違う!": Exit Sub
End If
'入力開始セル取得
Set DateInputRange = Worksheets("Sheet1").Range("C65536").End(xlUp).Offset(1)
'入力開始
For i = 0 To (12 - Month(TextBox1.Value))
DateInputRange.Offset(i).Value = DateAdd("m", i, TextBox1.Value)
'月とか日が別で欲しいなら、適当に以下のような感じで
'DateInputRange.Offset(i, 1).Value = Month(TextBox1.Value) & "月"
Next
End If
If Err.Number <> 0 Then MsgBox Err.Description 'なんかエラーが発生したとき用
Textbox1の入力をどのようにしているのか判断できないので
半角全角混在や和暦西暦などでもいけるようにしてみた
DateAddなので、>>44のコードと違い指定日が月の範囲を超えると月末になる(1月31日指定→2月28日)
あと、セルの表示は表示形式で対応するればいんじゃね
入力に「年」を省いた場合は、強制で入力した年になるので注意
日付入力は、DTPickerとか使えれば楽かも
50:デフォルトの名無しさん
09/07/19 00:50:29
DTPickerはVB買わないとあかんよ。
51:30
09/07/19 02:22:36
>>49 ありがとうございます
なにが書いてあるのかさっぱりですが。。
なにかと都合がいいので、日付のテキストボックスを開始月と支払日でそれぞれコンボボックスで
対応するように仕様変更しました。ごめんなさい。
On Errorは使ったことがありませんでしたが、覚えたほうが良さそうですね。
>>38も含めて理解できるよう頑張ってみます。
ただ別件でまた問題が、、、折れそうです、、、
52:30
09/07/19 02:24:36
>>38じゃなくて>>44ですね。。
53:30
09/07/19 02:39:33
>>49
日付のコンボボックスを「1〜28、月末」で変更するつもりでしたが、
少しでも軽くしたいのと月末を選択したときの対応が大変なので>>49を
使わせてもらうかもしれません。
ちょっと疲れたので寝ます。。
54:デフォルトの名無しさん
09/07/19 02:56:37
IsDateかDateSerialでいいんじゃ?
55:デフォルトの名無しさん
09/07/19 08:39:33
i=1
として、ABC1.TXTというファイルを開くときに
Open "FFT1.txt"
ではなく、iを使って開けるようにしたいのですが、どんな風にファイル名を
書けばよいでしょうか。
56:デフォルトの名無しさん
09/07/19 08:43:43
&
57:55
09/07/19 08:50:46
すいません、間違ってABCをFFTと書いてました。
ありがとうございます。
Open "ABC" & i & ".txt"
でいけました。
58:30,44,46
09/07/19 09:25:39
>30,51
月末というか、大の月・小の月対策が必要ならば
次の要件を満たすような処理を考えてみましょうか?
テキストボックスに入力した日付の「日」が翌月以降の月末に存在しない場合、
当月に限り月末を補正するが、その翌月以降には影響しない。
例 **/1/30 と入力したら **/2/28、**/3/30、・・・
59:デフォルトの名無しさん
09/07/19 11:55:32
今、起きました。。
>>58
お付き合いありがとうございます。
実は、パチンコやゲームで時間とお金を使うより有意義と感じてVBAを使用したソフトを作っています。
VBEditorの開き方も分からないところから作り始めました。
暇つぶし感覚で始めたソフト作成をある意味RPG的に楽しんでいます。
3連休中にある機能を追加しようと考えていましたが、自分のレベルではかなり難しくて。。
日付の仕様ですが、日付のテキストボックスは開始月と支払日でそれぞれコンボボックスで対応するのが理想です。
その場合、開始月のコンボボックスは「1月〜10月」、支払日のコンボボックスは「1日〜28日、月末」にする予定です。
支払日で「月末」を選択した場合、開始月のコンボボックスを見て支払日の月末を割り出そう考えています。
適当なシートに「」A1→1月」「B1→31日」、「A2→2月」「B2→28日」・・・という感じでデータを書いて、それを参照して
月末の支払日を算出しようと検討中です。
きっと>>58の案はもう書かれてそうですので参考に教えてもらっていいですか?
60:30,44,46,58
09/07/19 12:44:02
>59
うるう年を考えなくていいなら、12個の要素の配列に月末日を持っておいて
生成しようとする「月」毎に判定したらいいのでは?
dim 末日 as variant
〜
末日 = Array(31,28,31,30,31,30,31,31,30,31,30,31) '始めに設定しておく
〜
if 出力日 > 末日(月 - 1) then 出力日 = 末日(月 - 1) 'ループ処理の中
〜
うるう年を考慮するなら、うるう年判定して 末日(2 - 1) = 29 を追加するだけ
※要素数は12でも、要素番号(添え字)は0から始まる option base無指定のとき
61:37,44,46,58
09/07/19 12:56:11
ついでに:
自分は10年ほど前までは汎用機相手にCOBOLでプログラム開発してましたが、
移動で別の部署に移ってからは職場のPC相手にExcelVBAで省力化してました。
退職した今はボケ防止でExcelやOOo関係のスレに出没してます。
業務処理では日付関係のいろいろ(期間計算、新年号、2000年問題も)で苦労したので、
念のため大・小の月のことをコメントしてみたんです。
62:デフォルトの名無しさん
09/07/19 13:10:45
>>60
3連休中に機能の追加は諦めました。orz
今の知識では無理なので、もう一度本を見ながら基礎から覚えていこうと思います。
>>60は参考にさせていただきます。
ありがとうございました。
対応できたら報告します。;
63:デフォルトの名無しさん
09/07/19 14:21:33
>>62
>>対応できたら報告します。;
要りません。
64:デフォルトの名無しさん
09/07/19 15:05:54
確かに要らないなw
半月も弄ってれば大抵誰でも出来るようになる処理だし
65:37,44,46,58,61
09/07/19 20:03:10
>62
ユーザーフォームとかコンボボックスとか扱ってるレベルならわかってもらえると思ったんだけど・・・
自分はコンボボックスとかラジオボタンとかまだほとんど使ったことがないorz
66:デフォルトの名無しさん
09/07/19 21:14:58
つーか、やりたいことがいまいち見えんw
エスパーさんまとめてくれ。
67:デフォルトの名無しさん
09/07/19 21:35:01
えっと・・・いつも携帯から見てるんで控え目に発言してるんですけど・・・
大の月とかなんとか↑で話題になってるみたいですけど
月末日は「翌月」の「1日」から1を引けば簡単に出てくるものと思ってましたけど・・・
的外れな発言してたらすいませんおじゃましました・・・
68:デフォルトの名無しさん
09/07/19 22:27:41
普通はそうするわな〜
69:デフォルトの名無しさん
09/07/19 22:38:36
まあその方法もありなんだが、一行でやろうとすると
debug.print DateSerial(2009,12,0)
で11月の末日がでる。
70:デフォルトの名無しさん
09/07/19 22:45:03
>>69
うぁお
そんな裏技が!
あまりに裏技すぎても思わぬバグがこわいけどこれは大丈夫なのかな?
71:デフォルトの名無しさん
09/07/19 22:56:32
ようするに、(2009,m+1,0)で当月の末日が出るってこと。うるう年とかわざわざ考慮する必要がない。
0日が使えるのと同じで、0月とか13月も普通に「前月」「翌月」として使うことができる。
さらにマイナスも使える。-1月は前年の11月になる。
72:デフォルトの名無しさん
09/07/19 23:04:20
>>71
試してみたらワークシートのDATE関数でも使えるのな(2007で実験)
さすがエロい人はいるもんだ
73:37他
09/07/19 23:06:20
>67
その方法は知ってます。「OpenOffice.org 総合相談所 6」の420は自分なんですが、
翌月の〜ということは12月のときは1月のことになり、ややこしくなるので
ループ内は一番単純なこの方法をとりました。
>69
>DateSerial(yyyy,mm,0)という指定もアリなんですか? こちらもmmは翌月のこと
なので上と同じ理由で避けました。
74:デフォルトの名無しさん
09/07/19 23:09:02
後だしみっともないからやめろよ。
75:37他
09/07/19 23:09:17
>71
アップ前にリロードしてなかった。月の部分は1〜12限定じゃなかったんですか。
76:62
09/07/19 23:13:52
説明が分かり難くて申し訳ないです。。
やりたかったことは、ユーザーフォームのテキストボックスに入力した日付を
コマンドボタンをクリック後に、日付の月から12月分までを月だけ増やしてSheet4に書き出したかった。
コンボボックスの月が9月10日ならコマンドボタンをクリック後に、
C22→9月10日
C23→10月10日
C24→11月10日
C25→12月10日
といった感じです。
で、日が31日の場合、2月や4月はエラーになる問題がどうするか保留です。
現在は、日付をテキストボックスではなく、コンボボックスを2個用意して、月と日を別で
入力する仕様で検討中です。
諦めた理由は別件で問題があったからです。
ユーザーフォームを開いたときに、↑でシートに書き出したデータが現在の月であれば
Sheet1にコピーする方法が分からずに諦めていましたが、買物から帰ってきて、
ぼーっと本を見ていたら解決しました。。。下記コードでなんとかなりそうです。
If Worksheets("sheet4").Range("c22") <> "" Then
For hi = 22 To 1000
If Worksheets("sheet4").Cells(hi, 9).Value = Month(today) Then
With Worksheets("sheet1")
.Range("c65536").End(xlUp).Offset(1, 0) = Worksheets("sheet4").Cells(hi, 9).Offset(0, -6).Value
End With
End If
Next hi
End If
(実際のデータは日付だけではありません)
これで分かります?
77:62
09/07/19 23:15:19
あら?なんか出る幕なさそうですね。。
78:デフォルトの名無しさん
09/07/19 23:18:02
>74
excel vba dateserial でググると最初に出てくる「田中亨のVBA基礎セミナー」他
いくつかみてみたけど、通常の範囲外の値を指定する裏技は見ませんでした。
よろしければ、この裏技を紹介しているウェブサイトを紹介してもらえませんか?
79:デフォルトの名無しさん
09/07/19 23:24:30
ワロタ
80:デフォルトの名無しさん
09/07/19 23:28:40
>>78
> よろしければ、この裏技を紹介しているウェブサイトを紹介してもらえませんか?
あなたが今いてるここですよ。
色んな知識を持って回答してる皆さんに失礼がないかもう一度このスレを最初からご覧になってはいかがです?
別に私はあなたを排除するつもりはないのでそれなりの礼節を(たかが2ちゃんだからたいしたことないです)わきまえて質問を続けて下されば嬉しいですけどね
81:デフォルトの名無しさん
09/07/20 01:08:24
>>78
つか、Webにある情報だけが全てじゃないしw
実地で学んだことをここで吐き出してあげてんだよ
82:デフォルトの名無しさん
09/07/20 01:50:23
>>73
> 12月のときは1月のことになり
除余(Mod)使えば良いだけじゃん
DateSerial(y + m \ 12, m Mod 12 + 1, 0)
なんでこんな簡単なことが解らないんだ?
除余(割り算の余り)や整数商なんて小学4年生くらいのレベルだろ?
向こうの回答もその部分にバグがある内容だし
83:デフォルトの名無しさん
09/07/20 02:22:56
あんまゆとりをいじめてやんなよ
84:デフォルトの名無しさん
09/07/20 03:02:46
>>82
ぶつくさいいながらも使いやすそうなコード教えてくれるおまい優しいなw
85:デフォルトの名無しさん
09/07/20 08:47:21
vbaを使ってこんな悪いことしちゃいました、ってのがあったら教えてください
86:デフォルトの名無しさん
09/07/20 09:05:55
スレ違い
87:デフォルトの名無しさん
09/07/20 17:22:16
winXP,excel97
ユーザーフォームに6個のオプションボタンを配置し、3つまで選択可能にしたいです
これは可能なのでしょうか?
できるなら、方法を教えてください
プロパティをいじってみたけど上手くいきませんでした
88:デフォルトの名無しさん
09/07/20 17:32:04
グループ化 でぐぐれ
89:デフォルトの名無しさん
09/07/20 17:39:13
・グループネームを全部違うのにして全部選択可能にする
・押された時のイベントで全部のボタン調べて3つ以上チェック入ってたらキャンセル
でどうだろう
コードはわかんね
90:デフォルトの名無しさん
09/07/20 17:43:06
>>87
普通はオプションボタンは、一つを押すと他の唯一あるTrueの奴が消えることになる。
たとえば、
○○●●●○
のとき、
一番左のを押すとどれをFalseにすればいいかわからないから、根本的に無理のはず。
やりたいなら、チェックボックス6個に
Trueにしたときに、
それをあわせてTrueが3つになったらなら
他のFalseなチェックボックスを選択不能にする。
Falseにしたときに、
他のチェックボックスを選択可能にする。
的なことを書けばいいと思う。
91:デフォルトの名無しさん
09/07/20 17:46:44
>>85
たとえば暇つぶしに作った業務システムが知らないうちに改修されてて、
コメントしたアニメセリフとかエロ話とか上司の悪口とかを書いてて、
しかもそれが削除されないまま全社配布されたとかそんなの?
92:デフォルトの名無しさん
09/07/20 17:48:09
オプションボタンを1フレームごとに配置するとかだな?
フレームの非表示って出来たっけ
93:デフォルトの名無しさん
09/07/20 18:03:36
>>49
これを使わせていただきます。
コードが1/3以下になりました。
他、レスしてくれた方もありがとうございました。
94:デフォルトの名無しさん
09/07/20 18:08:01
>>92
プロパティのvisibileをfalseにすれば良いんじゃね?
95:87
09/07/20 18:24:56
みなさんレスありがとうございます
グループ化を試してみます
無理なら>>90の案を試してみます
96:デフォルトの名無しさん
09/07/20 20:58:53
Windows XP X64
Excel2003
を使用しております。
エクセルにボタンを追加して、
Sub Botton_Click()
'Book1を開く
Workbooks.Open "C:\Book1.xls"
'Book2にあるSheet1をBook1のSheetにコピー
Workbooks("Book2.xls").Worksheets("Sheet1").Copy _
After:=Workbooks("Book1.xls").Worksheets("Sheet1")
End Sub
といった感じにボタン押下時に別なブックにシートをコピーしたいのですが
「インデックスが有効範囲にありません」
というエラーが出てしまいます。
VBA初心者で初歩的な質問で申し訳ありませんが、どのようにすれば宜しいでしょうか?
97:デフォルトの名無しさん
09/07/20 21:10:08
コピー先のシートをactivateしてみるといんじゃね
98:デフォルトの名無しさん
09/07/20 21:28:31
>>97
アクティブにするのを見落としてました・・・
ありがとうございましたm(__)m
99:デフォルトの名無しさん
09/07/20 21:38:55
シートのコピーとか確かActiveでなくても普通にできた気がするから釈然としないけどそれで解決したんならいいのか・・・
Book2.xlsが開いててシート名も間違いなければそのままでなぜ駄目なのか?
100:デフォルトの名無しさん
09/07/20 21:47:43
Workbooks.Open "C:\Book1.xls"
でBook2が非アクティブになったためか、
Workbooks("Book2.xls").Worksheets("Sheet1").Copy _
After:=Workbooks("Book1.xls").Worksheets("Sheet1")
Sheet1が2つあるためか
101:デフォルトの名無しさん
09/07/20 23:37:54
環境
・WindowsXp
・Excel2003
sub 修正()
On Error Resume Next
Dim i as Integer
For i 136 to 140 step 1
If Range("AT7").value=Range("C"&i) then
Select Case Range("AT7").value
Case "お菓子"
Range("AT7").Activate
Activecell.offset(-43,-4).Activate ←ここでB6がアクティブにならない
Activecell.value="お菓子購入"
End Select
End If
Next
End sub
上記のコードで矢印の部分「Activecell.offset(-43,-4).Activate」でB6がアクティブにならず、
AT7がアクティブのまま「お菓子購入」が入力されてしまいます。何が原因でしょうか?
すみませんがよろしくお願いします。
102:デフォルトの名無しさん
09/07/20 23:58:26
わからんがとりあえずOn Error Resume Next を外せばデバッグしやすいんじゃね
103:デフォルトの名無しさん
09/07/21 00:00:05
あーわかった
Activecell.offset(-4,-43).Activat
にしてみ
104:デフォルトの名無しさん
09/07/21 00:15:04
AT7からB6なら ActiveCell.Offset(-1, -44).Activate だな
105:デフォルトの名無しさん
09/07/21 00:17:38
>>102
参考書に書いてあったのでよく分からないままいつも使ってたんですが
初心者はあまり使わないほうがいいんでしょうか?
>>103
>>104
ありがとうございます。RowとColumnを逆にしてたんですね。初歩的なミスで質問してしまってすみませんでした
106:デフォルトの名無しさん
09/07/21 00:26:19
vbに限らずgoto系は使わんほうがいいらしいぜ
107:デフォルトの名無しさん
09/07/21 01:20:19
>>105
もう見てないかもしれないけど「Activate〜Active」とか「Select〜Selection」が並んでいた場合は
1行にまとめて書けることが多い。
Range("AT7").Activate
Activecell.Offset(-1, -44).Activate
Activecell.Value = "お菓子購入"
↑この3行は1行にまとめられる。↓
Range("AT7").Offset(-1, -44).Value = "お菓子購入"
108:デフォルトの名無しさん
09/07/21 13:36:15
現在Excelでソルバーをマクロで操作するプログラムを作っています。
Sub ソルバーループ()
With Worksheets("jack")
For i = 1 To 10
With Worksheets("jack")
Solverok setcell:="$E$1", MaxMinVal:=2, ByChange:="$A$2:$D$2"
‘目的セルをE1として、その最小値を求める。変数はA2:D2。
SolverAdd CellRef:="$F$1", Relation:=1, FormulaText:="$G$1"
SolverSolve Userfinish:=True
SolverFinish KeepFinal:=1
Worksheets("Sheet1").Cells(i + 0, 5) = Worksheets("jack").Cells(1, 5)
Worksheets("Sheet1").Cells(i + 1, 1) = Worksheets("jack").Cells(2, 1)
Worksheets("Sheet1").Cells(i + 1, 2) = Worksheets("jack").Cells(2, 2)
Worksheets("Sheet1").Cells(i + 1, 3) = Worksheets("jack").Cells(2, 3)
Worksheets("Sheet1").Cells(i + 1, 4) = Worksheets("jack").Cells(2, 4)
End With
Next
End With
このプログラムのなかの
SolverAdd CellRef:="$F$1", Relation:=1, FormulaText:="$G$1"
という制約条件で、$G$1 を $G$10 まで変化させていき、各制約条件ごとに一つずつ
結果をワークシートのsheet1に書き込んでいきたいのですが
SolverAdd CellRef:="$F$1", Relation:=1, FormulaText:="$G$1"の部分に
どのようにして i を組み込めばいいでしょうか?
ほんの少しのヒントでも非常に有難いので、お力添えくだされば幸いです。
皆様お忙しいでしょうが、どうぞよろしくお願いいたします。。。
109:デフォルトの名無しさん
09/07/21 13:43:38
ア
110:デフォルトの名無しさん
09/07/21 15:27:22
Excelで選択したセルの端をドラッグすると切り取りと張り付けになると思うんですけど
この機能自体を使用禁止にすることって出来ますか?
111:デフォルトの名無しさん
09/07/21 16:21:06
>>108
&
112:デフォルトの名無しさん
09/07/21 17:13:53
すみません質問です。
C列に"abc"という文字列があった場合、その行全体を削除し
上に詰めるというマクロを組みたいのですが
どなたか教えていただけますでしょうか。
尚、オートフィルタを使わないやり方でお願い致します。
113:デフォルトの名無しさん
09/07/21 17:23:40
上?
左じゃなくて?
114:デフォルトの名無しさん
09/07/21 17:28:01
>>112
1.C列に文字列abcがあるなら行削除
2.配列に
115:デフォルトの名無しさん
09/07/21 17:30:25
とりあえず4000行見るマクロ
Sub aaa()
For a = 1 To 4000
If Cells(a, 3) = "abc" Then Rows(a).Delete shift:=xlUp
Next
End Sub
116:デフォルトの名無しさん
09/07/21 17:39:44
>>112
Sub a()
For r = ActiveCell.SpecialCells(xlLastCell).Row To 1 Step -1
If Cells(r, 3) = "abc" Then Rows(r).Delete
Next
End Sub
>>115
上からだとabcが連続していた時に消えない
117:デフォルトの名無しさん
09/07/21 17:41:30
>>115
これだと2行つづいて"abc"があった場合抜けてしまわない?
オートフィルタを使った方法を教えて欲しい
118:デフォルトの名無しさん
09/07/21 17:47:51
オートフィルタはabcが隠れるだけで本当に消えるわけじゃないからなあ
119:デフォルトの名無しさん
09/07/21 18:11:41
>>108
そんなの余裕だろうが。
SolverAdd CellRef:="$F$1", Relation:=1, FormulaText:="G(1+i)"
で一発だ。
120:108
09/07/21 19:24:43
>>109,>>111
ヒントをどうもありがとうございます。
ただ、&の意味がわからないのですが、どういうことでしょうか?
$だと固定だから&にしろということでしょうか・・・?
無知ですいません。
121:デフォルトの名無しさん
09/07/21 19:30:31
>>120
"$G$" & i
&は文字列の結合
122:108
09/07/21 21:36:02
>>121
無事プログラムがうまく動きました!
どうもありがとうございます!
123:デフォルトの名無しさん
09/07/21 21:38:52
Dim 日数 As Integer
Dim 本日 As Date
本日 = Date
日数 = DateDiff("d", "2009/7/10", "本日")
とやったところ、型が一致しませんとでます。
本日までの日数を求めたいのですがどうすればいいのでしょうか?
124:デフォルトの名無しさん
09/07/21 21:44:33
Excel立ち上げず書いてるからおかしかったら突っ込みよろしく
>>117
sub オートフィルタを使った方法()
Dim 元シート as WorkSheet,作業シート as WorkSheet
Set 元シート=ActiveSheet
元シート.Copy
Set 作業シート=ActiveSheet
作業シート.Range("C1").AutoFilter 1,"<>""*abc*"""
作業シート.Cells.SpecialCells(xlCellTypeVisible).Copy 元シート.Cells.
作業シート.Parent.Close False
End sub
125:デフォルトの名無しさん
09/07/21 21:47:28
>>123
"本日" w
126:デフォルトの名無しさん
09/07/21 21:47:51
>>123
変数の本日にはダブルクォーテーションいらんよ
「本日」という文字列は計算できんじゃろ
127:デフォルトの名無しさん
09/07/21 22:08:31
125に代わっていうと
日数 = DateDiff("d", "2009/7/10", "本日")
は
日数 = DateDiff("d", "2009/7/10", Now)
日数 = DateDiff("d", "2009/7/10", Date)
128:124
09/07/21 22:12:34
あっコピー先の最後の「.」はいらんわな
あとクライテリアの*abc*を囲う必要があったかなかったか自信ない
129:デフォルトの名無しさん
09/07/21 22:37:38
>>116
けつからやんのか。頭良いな。
130:123
09/07/21 22:40:21
レスありがとうございます。
無事できました。>>127さんのようにしました。
131:デフォルトの名無しさん
09/07/22 00:02:50
>>129
基本中の基本。
君の頭が○○なだけです。
132:デフォルトの名無しさん
09/07/22 00:21:45
こんなんピボットでやれば一発だわwwwww
133:デフォルトの名無しさん
09/07/22 01:32:28
>>131
おまえにいってねえからwww
134:デフォルトの名無しさん
09/07/22 18:03:46
また堕ちるぞ
135:デフォルトの名無しさん
09/07/22 23:04:58
>>133
ワロスw
136:デフォルトの名無しさん
09/07/23 00:42:00
現在Excelで作ったxmlを特定のURLへ送信するプログラムを作成しています。
(Microsoft XML version2.0使用)
Sub xml()
Dim aaa As Integer
aaa = "001"
Dim bbb As String
bbb = "001"
Dim xmlDoc As MSXML.DOMDocument
Dim xmlPI As IXMLDOMProcessingInstruction
Dim node(3) As IXMLDOMNode
Dim attr As MSXML.IXMLDOMAttribute
Set xmlDoc = New MSXML.DOMDocument
Set xmlPI = xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8"""))
Set node(1) = xmlDoc.appendChild(xmlDoc.createNode(NODE_ELEMENT, "TEST", ""))
Set node(2) = node(1).appendChild(xmlDoc.createNode(NODE_ELEMENT, "test1", "")): node(2).Text = aaa
Set node(2) = node(1).appendChild(xmlDoc.createNode(NODE_ELEMENT, "test2", "")): node(2).Text = bbb
'作成されたxml確認用
xmlDoc.Save ("test.txt")
End Sub
@set nodeに入れたaaaとbbbですが、1と表示されてしまいます。001と表示するにはどうしたら良いのでしょうか。
A作成された値(xml)を特定のURLへ送信したいのですが、どのライブラリ?等を利用すれば宜しいでしょうか
(値を送ると、<result>NG</result>といった値が返却される予定です)
すみませんがお力添え頂けると幸いです。
137:デフォルトの名無しさん
09/07/23 02:07:25
>>136
Excel 2007 + MSXML3 (MSXML2がなかった)とVBScript 5.0 + MSXML2 (Officeがなかった)の2環境でやってみたが、
いずれもbbbのほうは001になったぞ。
それをHTTPで送りたいのなら、MSXML.XMLHTTPRequestを使えばいい。
138:デフォルトの名無しさん
09/07/23 03:52:34
変数についてなんですが、
-----------------------------------
Dim 値 As Integer
値 = Range("A1")
Range("A1").FomulaR1C1 = "COUNTA(R[1]C[1],R[1]C[10])" 'A行
Range("A1").Copy
Range("A1").PasteSpecial (xlCellTypeValue)
Range("B1").Activate
Activecell,offeset(1,値).Select 'B行
---------------------------------------------------------
上記のようなコードで実行するとA行で集計されたはずの数値がB行に来た段階で代入されていないようなのですが、
変数というのは、宣言の時点で代入される数値が決まっていないといけないのでしょうか?
139:デフォルトの名無しさん
09/07/23 06:29:56
Range("A1").FomulaR1C1 = "=COUNTA(R[1]C[1],R[1]C[10])" 'A行
いこーるつけなさい
140:デフォルトの名無しさん
09/07/23 07:47:58
>>138
エスパーするとやりたいのはこういうこと?
Dim 値 As Integer
値 = WorksheetFnction.CountA(Range("B2:K2"))
Range("B1").Offeset(1,値).Select
質問に直接答えれば宣言はいつしてもいいけど変数の使い方がおかしい
Integer→Rangeに変えてSet 値 = Range("A1")
最後の行をActiveCell..Offeset(1,値.Value).Select
141:デフォルトの名無しさん
09/07/23 18:06:57
>>138
Activecell,offeset(1,値).Select 'B行
↑
点の種類間違ってる
最後の行はたぶんoffeset→offset
クライマックスの2行まとめて
Cells(2,2+値).Select 'ともかけるます
>>140
変数の使い方はあってない?
Range("A1")
を取得すると
Range("A1").Value
を返すしIntegerで足りるし
値.Copy とかやるでもないし
142:デフォルトの名無しさん
09/07/23 18:36:20
Excel2007です。
赤丸(背景色は透明)を作りたいのですが、背景色を透明にできません。
Shape.Line.BackColorの編集でできそうなのですが、検索方法が悪いのか見つかりません。(この予測は間違いですか?)
Dim myShape As Shape
With ThisWorkbook.Worksheets("Sheet1")
Set addCell = .Cells(intRow, intCol)
Set myShape = .Shapes.AddShape(msoShapeOval, addCell.Left, addCell.Top, addCell.Width, addCell.Height)
myShape.Line.ForeColor.RGB = RGB(255, 0, 0)
myShape.Line.Weight = 2
End With
よろしくお願いいたします。
143:デフォルトの名無しさん
09/07/23 18:48:15
>>142
myShape.Fill.Visible = msoFalse
144:デフォルトの名無しさん
09/07/23 19:52:54
>>143
無事、透明になりました。ありがとうございます。
145:デフォルトの名無しさん
09/07/23 22:14:47
>>141
あっ、そういう風に見れば
間違ってるのは変数「値」にA1の値を代入するタイミングだな
146:デフォルトの名無しさん
09/07/23 23:31:01
>>137
ありがとうございます!
147:デフォルトの名無しさん
09/07/25 12:07:00
エクセル2000を使用しています。
コンボボックス2個、テキストボックス1個、コマンドボタンのユーザーフォームで
シートに以下の図のようにデータがあります。
コンボボックス1にA列の値、コンボボックス2にB列の値を入れて、
コマンドボタンを実行すると、該当するC列の値をテキストボックスに表示する
にはどうすればいいですか?
A B C
1 ああ カカ 100
2 ああ キキ 200
3 ああ クク 300
4 いい ケケ 400
5 いい ココ 500
コンボボックス1に「ああ」、コンボボックス2に「クク」なら
テキストボックスは「300」になるようにしたいです。
よろしくお願いします。
148:デフォルトの名無しさん
09/07/25 12:24:06
曖昧だな
149:デフォルトの名無しさん
09/07/25 12:35:45
1とA、2とBの合致をANDでもいいから組み合わせて、そのセルを変数に格納して、テキストボックス=セル(変数、3).バリューすればいいかも!
150:デフォルトの名無しさん
09/07/25 12:44:08
vbaが体系的に勉強できるサイトや本でおすすめあれば教えてください。
151:デフォルトの名無しさん
09/07/25 12:48:49
>>150
ここでROMがお奨め(;゚д゚)ァ
152:デフォルトの名無しさん
09/07/25 13:27:13
項目1, 項目2, 項目3, 項目4, 項目n・・・(最大:n=255)
あああ, ううう, えええ, くくく, ・・・
いいい, , おおお, けけけ, ・・・
, , かかか, , ・・・
, , ききき, , ・・・
(最大:行=65535)
とあった場合、
項目1, 項目2, 項目3, 項目4・・・
あああ, ううう, えええ, くくく
いいい, ううう, おおお, くくく
あああ, ううう, かかか, くくく
いいい, ううう, ききき, くくく
あああ, ううう, えええ, けけけ
いいい, ううう, おおお, けけけ
あああ, ううう, かかか, けけけ
いいい, ううう, ききき, けけけ
・
・
・
のように、データを詰めて別のシートの同じ位置(例:A1)から出力したいです。
※行・列は可変データです。
153:デフォルトの名無しさん
09/07/25 13:29:47
>>150
151もおすすめだけど「体系的」ではないわなw
確かスレ違いだったと思うから紹介はしないが適当にググればいくつか出てくるからサイトさがしはそんなに難しくない
本買うなら最初はあまり分厚いのでなくて初心者向けの簡単な入門書やってみれば
自分が身につけたいことが見えてきて次に本買うときは自分の好みに合った本選びできる
154:デフォルトの名無しさん
09/07/25 13:37:24
>150
excel vba 入門 に一致する日本語のページ 約 183,000 件中 1 - 10 件目 (0.35 秒)
155:デフォルトの名無しさん
09/07/25 13:39:59
>>152
これって
丸投げというか、依頼じゃね
何がわからないか書かないと答えられないだろ
156:デフォルトの名無しさん
09/07/25 13:45:47
>>152
nhngdおk
157:デフォルトの名無しさん
09/07/25 13:59:52
>152
この例だとfor〜nextループ4重で行数は2×1×4×2=16行。
組み合わせの問題で項目数が不定ということは再帰処理ができるとわかりやすいんだろうけど・・・・
「excel vba 再帰」でググったら再帰プログラムができるらしい。
ひとつ間違えると無限ループになるし、項目数最大256個が大丈夫なのか、やってみないと
なんともいえない。
158:157
09/07/25 17:28:56
>152
行基準(再帰処理)でやろうとしたら、こんがらがってしまい中断。列基準だとなんかできそう。
先に列数(4)と、列毎の行数を調べ、配列に設定。この際添え字は0〜列数+1とし、
配列(0)と配列(列数+1)の内容は1にしておく。
その結果、配列(0)=1、配列(1)=2、配列(2)=1、配列(3)=4、配列(4)=2、配列(5)=1 となる。
左端列(A列:列番号1)は当該列の要素("あああ"、"いいい"の2種類をそれぞれ左側の組み合
わせ数1回繰り返したものを右側の組み合わせ数(1×4×2=)8回出力する。
→あああ、いいい を8回
B列(列番号2)は当該列の要素("ううう")の1種類をそれぞれ左側の組み合わせ数2回繰り返した
ものを、右側の組み合わせ数(1×4×2=)8回出力する。
→ううう、ううう を8回
C列(列番号3)は当該列の要素("えええ"、"おおお"、"かかか"、"ききき")の4種類をそれぞれ
左側の組み合わせ数2回繰り返したものを、右側の組み合わせ数2回出力する。
→(えええ を2回、おおお を2回、かかか を2回、ききき を2回)を2回
D列(列番号4)は当該列の要素("くくく"、"けけけ")の2種類をそれぞれ左側の組み合わせ数
8回繰り返したものを、右側の組み合わせ数1回出力する。
→くくく を8回、けけけ を8回
列数がNで、n列目の出力を考えた場合、
要素数は 配列(n)
左側の組み合わせ数は 配列(0)×配列(1)×・・・×配列(n−1)
A列の場合も配列(0)=1があるので計算に支障なし
右側の組み合わせ数は 配列(n+1)×・・・配列(N−1)×配列(N)
最右列の場合も配列(N+1)=1があるので計算に支障なし
159:157
09/07/25 17:35:38
>158の続き
>152の例だと「項目3」が えええ、おおお、かかか、ききき、えええ、・・・という
順番だけど、えええ、えええ、おおお、おおお、かかか、かかか、ききき、ききき・・・の
並びの方が組み合わせ順としては自然だと思う。項目4も同様に同じものが8回ずつ繰り返す
ことになります。
>152 ここまで示したらできますか?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4308日前に更新/149 KB
担当:undef