09/07/14 19:07:54
ExcelのVBAに関する質問スレです
前スレ スレリンク(tech板)
★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)
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と表示するにはどうしたら良いのでしょうか。
②作成された値(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 ここまで示したらできますか?
160:デフォルトの名無しさん
09/07/25 18:55:00
よくわからないけど、列ごとにソートしたいのか?
格納用の配列(65534、254)を用意
ソート用の配列(65534、0)を用意
列をカウントする変数iを用意
for i=0to254
ソート用の配列に列データを格納、ソート
格納用の配列(65534、i)にソートしたデータを格納
最後にシートに格納した配列を流し込む
161:デフォルトの名無しさん
09/07/25 20:12:03
>>152
死ぬほど遅いけどこういうことか?
Sub test()
For Each c In Range(Cells(1, 1), Cells(65535, 255))
If (c.Value = Empty And c.Rows > 1) Then
c.Value = c.Offset(-1, 0).Value
End If
Next
End Sub
162:デフォルトの名無しさん
09/07/25 21:10:28
>>152
1.まず、項目1...nの要素を数える
2.数えた要素を掛け算、K1xK2x...xKn
3.2.で得られた数値が必要な行数なので、
各項目ごとに各要素で必要行数だけ埋める
163:162
09/07/25 21:13:15
すまそ
2.数えた要素の、最小公倍数を求める
164:162
09/07/25 21:16:14
すまそ
だれか、2.の正解を頼む
165:162
09/07/25 21:18:27
ああ、最初の162で正解でした
166:162
09/07/25 21:22:58
>>152
の質問で
あああ, ううう, おおお, くくく
の組み合わせが必要かどうかで答えが変わるね
スレよごし、すまそ
167:デフォルトの名無しさん
09/07/26 00:54:28
環境
・WindowsVista
・Excel2002
A1~A10の合計をC2に表示させるマクロを作りたいのですが上手くいきません。
自分で作ったのは以下の通りです。
Sub practice()
Dim i As Integer
For i = 1 To 10
Cells(2, 3) = Cells(i, 1) + Cells(i, 1) + Cells(i, 1) + Cells(i, 1) + Cells(i, 1) + Cells(i, 1) + Cells(i, 1) + Cells(i, 1) + Cells(i, 1) + Cells(i, 1)
Next i
End Sub
アドバイスを頂けると助かります。
よろしくお願いします。
168:デフォルトの名無しさん
09/07/26 01:01:07
どううまく動かないか説明もせずにアドバイスとな
169:デフォルトの名無しさん
09/07/26 01:12:49
説明不足で申し訳ありません。
上手くいかないというのは合計の値がオートSUMで計算した合計と一致しないということです。
170:デフォルトの名無しさん
09/07/26 01:21:21
やりたいことはコレか?
Sub practice()
Dim i As Integer
Dim sum as Integer
sum = 0
For i = 1 To 10
sum = sum + Cells(i, 1)
Next i
Cells(2, 3) = sum
End Sub
171:デフォルトの名無しさん
09/07/26 01:26:42
>>167
元マクロ無視して書けばこういうこと?
Sub practice()
range("c2") = worksheetfunction.sum(range("a1:a10"))
End Sub
172:167
09/07/26 01:28:41
>>170
値が一致しました。ありがとうございました。
173:デフォルトの名無しさん
09/07/26 03:50:40
どうせ小数をintegerで計算したってオチだろ
174:デフォルトの名無しさん
09/07/26 08:32:13
セルを各々9回余分に加算してたんだろ
175:デフォルトの名無しさん
09/07/26 09:25:18
動かないとかエラーが出てるとか書く時はどう望んだ風に動かないとかどんなエラーメッセージが出てるとか書け
と>>1に書いたとしても、読みもしないんだろうなぁ。
176:デフォルトの名無しさん
09/07/26 09:33:22
エスパーだけどループ処理を使ってSUMさせる課題か何かだな
177:デフォルトの名無しさん
09/07/26 13:48:35
よろしくお願いしますm(__)m
Excelで店舗の営業日報を作れるデータを作成しました。
他人がそのデータを使うワケなのですが、
データに打ち込んで、上書き保存などはできるが、
データそのものを複製やコピーする事を防止する事は可能ですか?
また、暗証番号機能などで、その複製のロックを管理する事は可能でしょうか?
あるとすればどのような手段でデータをその人に預ければよいのでしょうか。
わかりずらいかも知れませんが
よろしくお願いしますm(__)m
178:デフォルトの名無しさん
09/07/26 14:00:33
>>177
マルチ 芯でください
179:デフォルトの名無しさん
09/07/26 16:08:32
できる
で、マルチならどこなのか晴れYO
180:デフォルトの名無しさん
09/07/26 16:09:31
54 :名無しさん@そうだ選挙にいこう :2009/07/26(日) 13:28:31
よろしくお願いしますm(__)m
Excelで店舗の営業日報を作れるデータを作成しました。
他人がそのデータを使うワケなのですが、
データに打ち込んで、上書き保存などはできるが、
データそのものを複製やコピーする事を防止する事は可能ですか?
また、暗証番号機能などで、その複製のロックを管理する事は可能でしょうか?
あるとすればどのような手段でデータをその人に預ければよいのでしょうか。
わかりずらいかも知れませんが
よろしくお願いしますm(__)m
181:デフォルトの名無しさん
09/07/26 17:25:08
自分>>177です。
マルチとは
『他でも質問してる』
って意味なのですね。
すみませんm(__)m
ドコで質問すればベストか、また、
色んな人に聞けばもしかしたら、と思い書き込みしてしまいましたm(__)m
ご迷惑おかけしましたm(__)m
さしつかえ無ければ>>179さん、簡単にでも教えていただけませんでしょうか?
よろしくお願いしますm(__)m
182:デフォルトの名無しさん
09/07/26 17:29:37
↑
女子大生or女子高生なら、即解決w
183:デフォルトの名無しさん
09/07/26 17:53:50
☆質問例☆
Excelで店舗の営業日報を作れるデータを作成しました。
他人がそのデータを使うワケなのですが、
都内の中学校にかよう15歳の女子中学中学生ですが、最近中学1年の妹の胸が大きくなってきて困ります。
まだ中学生なのに私よりも膨らみが目立っているのが少し悲しいです。
一緒にお風呂に入るとよくわかります。
妹は私の気持ちに気がつくどころか、ことあるごとにさわったりもんだりしてくるのです・・・。
データに打ち込んで、上書き保存などはできるが、
データそのものを複製やコピーする事を防止する事は可能ですか?
また、暗証番号機能などで、その複製のロックを管理する事は可能でしょうか?
あるとすればどのような手段でデータをその人に預ければよいのでしょうか。
今日もスポーツブラの下から手を入れてきて、声を堪えるのに大変でした。
わかりずらいかも知れませんが
よろしくお願いしますm(__)m
184:デフォルトの名無しさん
09/07/26 18:13:54
俺は貧乳でもOKだよ。
185:デフォルトの名無しさん
09/07/26 22:33:47
XP,OFFICE 2007
初心者&初カキコです。
いきなりすみません。
配列変数 A(3,100)があるとして、
A(2,0)~A(2,100)や、A(3,0)~A(3,100)といった各一次元配列の平均をそれぞれ出したいのですが、
全ての平均を出す場合は
.Average(A)
ですが、各次元毎だと、方法が解りません。
どなたか指導をお願いします。
186:デフォルトの名無しさん
09/07/26 22:48:03
環境
・WindowsVista
・Excel2007
SheetAに貼った画像の中から選択したものを一つSheetBに貼りたいんですが
どうすればいいですか?
187:デフォルトの名無しさん
09/07/26 22:58:51
>186
マクロの自動記録は試してみましたか?
当方Excel2003ですが、自動記録してできたソースの1~2行コメント化するだけで、できましたよ。
188:デフォルトの名無しさん
09/07/26 23:02:24
>185
凡人なので、for ~ next ループで回しながら、合計と件数を調べてわり算で求める方法しか知りません。
これ以外の回答をお望み?
189:デフォルトの名無しさん
09/07/26 23:03:27
>>187
ありがとうございます
やってみます
190:デフォルトの名無しさん
09/07/26 23:29:12
>188
出来るだけ早くしたくて。。
すみません。実は50×100×10000の三次元配列なので、それやると時間が半端ないんです。
191:188
09/07/26 23:34:11
>185,190
情報の後出しイクナイ
192:デフォルトの名無しさん
09/07/26 23:37:25
>>186ですが、自動記録を使ってやってみました
でもだめでした・・
Sheet2にある複数の図のうち、異なる図をコピーしても、すべて
Sheets("Sheet2").Select
Selection.Copy
となってしまいます
コピーする図を選択するにはどのようにすればいいんですか?
193:デフォルトの名無しさん
09/07/26 23:39:54
>>191
そんなの後出しじゃないだろ。
質問の内容から想定してしかるべき。
194:デフォルトの名無しさん
09/07/26 23:41:24
for ~ nextで変数を複数設定したい場合はどうすればできますか?
たとえば変数iが「5 to 101 step 24」で変数kが「5 to 20 step 5」として
cells(i,k).copy
selection.paste
みたいな感じで動作させたいです。
195:デフォルトの名無しさん
09/07/26 23:47:02
>>191
「俺にはわからない。」と言えばいいんだよ。
>情報の後出しイクナイ
なんだこりゃ?ぶさいく。
196:デフォルトの名無しさん
09/07/26 23:47:19
>191
確かに。後だしは良くないですよね。すみません。
出来るだけ簡単なシチュエーションにしたかったんです。
ところで、どなたか>185のやり方をご存知ないでしょうか?
197:187
09/07/26 23:59:08
>192
当方の手順(マクロの自動記録)シートAに図形があって選択していない状態から
1 図形をクリック
2 メニューの編集-コピー
3 シートBのタブをクリック
4 メニューの編集-貼り付け
これだけです。できたソースは↓で、1行目だけ削除すればいい。
ActiveSheet.Shapes("Picture 1").Select ←これだけ削除
Selection.Copy
Sheets("SheetB").Select
ActiveSheet.Paste
実行する際は、マクロを呼び出す前にコピーしたい図形をクリックして選択
状態にしておくこと。シートBの貼り付け先を指定したいときは、自動記録
のときに当該セルをクリックする。
198:デフォルトの名無しさん
09/07/27 00:04:47
>192
196ですが、世の中ギブアンドテイクって事で、試して見てください。
Worksheets("A").shapes(i).Copy
Worksheets("B").Activate
Active.Sheet.Paste
iの部分に画像が何枚目かを代入。
199:デフォルトの名無しさん
09/07/27 00:07:40
>>197
>>実行する際は、マクロを呼び出す前にコピーしたい図形をクリックして選択
状態にしておくこと。
この作業無しでする方法はないですか?
200:デフォルトの名無しさん
09/07/27 00:22:25
>>198
できました!
みなさんありがとうございました
201:デフォルトの名無しさん
09/07/27 01:24:29
>>185
Range(Cells(1, 1), Cells(3, 100)) = a
として
各行の平均を出す
202:デフォルトの名無しさん
09/07/27 01:28:15
>>194
k = 5
For i = 5 To 101 Step 24
If k > 20 Then Exit For
'↑はkのTo 20があまり重要でないならいらない
Cells(i,k).Copy
Selection.Paste
k = k + 5
Next
こんなんなったけどいいか?
これだと、変数iとkがいずれかはみ出したらループを抜ける。
これだと、(i,k)=(5,5),(29,10),(53,15),(77,20)の4回ループ内を実行する。
203:デフォルトの名無しさん
09/07/27 01:42:17
>>202
ありがとうございます。
上記の方法で無事動作しました。
ちなみに変数にしたい要素が3つ以上ある場合というのは一般的にどういう処理が効率的でしょうか?
今はいちいちすべての場合分けをして記述していますが、それぞれの増減は規則性があるので
なんとか簡易にしたいと思っています。
204:デフォルトの名無しさん
09/07/27 01:53:41
>>185
Sub test()
Debug.Print WorksheetFunction.Average(Range("A1:A100"))
Debug.Print WorksheetFunction.Average(Range("B1:B100"))
Debug.Print WorksheetFunction.Average(Range("C1:C100"))
End Sub
205:デフォルトの名無しさん
09/07/27 01:53:48
>201
ありがとうございます。
やはりシートを利用するしかないんでしょうね。
それか個別の一次元配列変数を宣言して代入とか。
出来れば、.Average(A(2))とかの記述でその従属二次元配列が計算されるのを期待したんですが、
特定の次元を宣言するような関数なり構文はないんですね。。
今日はもう寝ます。明日会社だし。
ありがとうございました。
206:デフォルトの名無しさん
09/07/27 10:20:03
>>203
「一般的」と「効率的」と「簡易」は両立が難しい。
何がやりたいのか自分でもわかってない気配がするが、まずは質問を絞れ。
ループ終了の条件が2つ以上ある時は無理にFor Nextを使わない。
Exit ForやGotoのような、プログラムの流れを強制的に変える命令は、
あまり使わない方がいい。
i = 5
k = 5
While (i <= 101) And (k <= 20)
Cells(i, k) 以下略
i = i + 24
k = k + 5
Wend
207:デフォルトの名無しさん
09/07/27 10:44:58
変数が大量にあって、ループの回数も多くなると、
ForとIfでもWhileでも、終了条件の判定回数が増えるから少し効率が落ちるね。
そういう時は最初にループの回数を調べしまうといい。
回数i = (101 - 5) / 24
回数k = (20 - 5) / 5
If 回数i < 回数k Then
回数 = 回数i
Else
回数 = 回数k
End If
i = 5
k = 5
For a = 1 To 回数
Cells 以下省略
i = i + 24
k = k + 5
Next
あとはケースバイケース。
可能なら、こんなふうに数式を短縮してみるとか。
For a = 0 To 回数 - 1
Cells(5 + 24 * a, 5 + 5 * a) 以下省略
Next
208:デフォルトの名無しさん
09/07/27 17:17:40
strTextLine = "A,B,C,D,"
というCSVファイルがあって、これをDataという配列変数に
Data = Split(strTextLine, ",")
とすると
DATA[0]はA
DATA[1]はB
DATA[2]はC
DATA[3]はD
ですが
DATA[5]にナルが入るんでしょうか?
それとも最後のカンマは無視されるんでしょうか?
配列に入れて処理を加えた後に
strTextLine = Data(0)
For C = 1 To UBound(Data)
strTextLine = strTextLine & "," & Data(C)
Next C
で戻してやると最後のカンマは生きているので、無視はされてないのではないかと思うのですが、確証が得たいので質問しました。
209:デフォルトの名無しさん
09/07/27 17:33:58
あれ使うといいよ
イミディエイなんとか
210:デフォルトの名無しさん
09/07/27 18:53:26
>>208
さすがにDATA[5]には何も入らんだろう。という挙げ足は置いといて。
たとえば元のデータが"A,,,B"で長さが0の文字列が無視されてしまったらどうなると思う?
211:デフォルトの名無しさん
09/07/27 18:57:25
何百行あるか何千行あるかわからないテキストファイルを一行ずつ配列に入れたいんですが
LineInputを繰り返す度に毎回ReDimしながら代入するしかありませんか?
なんとなくRedimを繰り返すのは処理速度的にあまりスマートではないのではという懸念があるのですが。
一度LineInputの度に変数に+1して行数を求めてから
もう一度LineInputと代入を繰り返すのとどっちが良いでしょうか。
212:デフォルトの名無しさん
09/07/27 19:25:27
俺なら最初に何行あるかを確認して、その分の配列をとり格納するようにすると思うけど、
スマートとかどうとか言う以前に目的を達成できたら、それで良いのでは?
デバッグの容易さとか保守性の容易さとかを考慮するのは大事だと思うけど。
213:デフォルトの名無しさん
09/07/27 21:51:33
>>208,209
イミディエイトウインドウのことですな。
DATA[4]なら
Debug.Print DATA(4)
で調べられますYo.
っていうかこの場合ローカル ウィンドウで直接見たほうが早くね?
214:デフォルトの名無しさん
09/07/27 23:35:50
>>211
1行ずつ増やすんじゃなくて、たとえば100行とか200行単位で拡張していって、
最後に余った分はもう一度ReDimして削るようにすれば、だいぶ軽くなる。
行の長さの最大値とかファイルの大きさがある程度わかってれば、
もうちょっと別のアプローチもあるんだけど。
215:デフォルトの名無しさん
09/07/27 23:44:05
>>211
ファイル全体を文字列変数に一気に読み込んだあと
Split関数で区切りを改行コードにして分割
216:デフォルトの名無しさん
09/07/28 00:35:54
WindowsXPのOffice2003を使用しています。
型番や製品名の一覧があり、これらが別に用意されている製品の型番などの書かれたリストと
一字一句相違ない事を確認する作業を補助するマクロを作ろうとしています。
列Aに
aaa
bba
ccc
zzz
とあり、別のシートにリストがあって
aaa
bbb
ccc
ddd
の様に書かれていたら、列Aのbbaとzzzがリストにないのでそのセルを着色する、と言う処理を考えています。
この様なリスト総当たり的な判定、間違い探しを行う事は可能でしょうか。
URLリンク(paint.s13.dxbeat.com)
画像は処理前後のイメージです。列Cにコピーするわけではありません。
実際にはリストもデータもそれなりの量があります。
(なお、ループ処理、次の行、列、リストへの移動などは別に変数を切ってある範囲を直指定するなど力業でやってしまう予定です。)
マッチングのやり方として、以下を考えています。
1.リストの先頭の文字列をデータの列Aの先頭から総なめして、次のリストの文字列へ、、の繰り返し。
2.何かしらの関数でリストを一括で読み込めて、データの列Aを上からマッチングしてくれるやり方。
2は希望ですが、何か良い手段がありましたらご教授お願いします。
217:デフォルトの名無しさん
09/07/28 00:42:41
よし!ここでVLOOKUP関数だ!
218:デフォルトの名無しさん
09/07/28 00:46:43
>216
そういう関数があるかは解りませんが、結局マッチングしなかったセルを色付けしないといけないので、
For~Next構文を使用する事になると思いますので、1.をお勧めします。
219:デフォルトの名無しさん
09/07/28 00:53:48
>>216
作業列を1列使えばワークシート関数だけでできるんだけど、VBA使わないとだめ?
220:デフォルトの名無しさん
09/07/28 00:54:27
VLOOKUPと条件付書式を使えばできるんじゃないかな。
俺ならマクロでするけど。
221:デフォルトの名無しさん
09/07/28 00:58:52
>>216
個人的お勧めは3.フィルタオプション
だけれどちょっと調べてよくわからないなら1.総ナメが堅いかな
結構な量あるとはいっても2003の行に入る分量なら
よほど下手なコード書かない限りたいして時間かからない
222:216
09/07/28 01:13:53
皆さんレスありがとうございます。
>>217
調べてみました。まさにマッチングはこれだ!と言う感じでしたが、リストの別の値を代入するのではなく
色を付けたいのでどうして良いものか… あ、何でも良いから値をマッチしたら変数に値を一旦格納して
その後if文で変数を見て色塗りを振り分ける、、って感じなら出来そうですね。
>>218
はい、1も考えてみます。パフォーマンスがやや心配ですが^^;
ループはいずれかの方法を使いますが、時間の関係と空のセルも多々あり得るので手を抜こうと画策中です。
>>219
実は既にデータシートに数式が入っていたりして、なるべく体裁をいじりたくないというのが一点と
列が20個ほど、列の数だけリストも存在し、行数は100~200位なのでVBAの方が良いのかなと考えました。
>>220
はい、vlookupをちょっと調べてみます。
条件付き書式は多分勝手に組んじゃダメと言われそうなので回避する方向で考えています。
>>221
なるほど、オートフィルタの制限無しバージョンみたいな感じですね。しかもリストの範囲も指定できて出力も出来ると。
参考にさせていただきます。ただ、各ファイルで毎回設定各列を指定する必要がありそうですね。
上記データシートが一日に10~20ファイル届いて捌かないと行けないので、もう少し自動化の道も探ってみます。
223:デフォルトの名無しさん
09/07/28 01:37:25
>222
218です。20*200なら配列変数に格納してMatchなりVlookUpなりで検索かける方がセルに情報を読みに行く時間が短縮出来ますよ。ほんと僅かですけど。
変数格納もRangeオブジェクト使えば一瞬ですし。
224:デフォルトの名無しさん
09/07/28 01:42:13
223です。
はあ?って思われたでしょうね。
誤爆しました。223は忘れて下さい。時間は同じでした。
225:デフォルトの名無しさん
09/07/28 07:35:38
すいません、Excel2003なんですが質問が二つあります。
1.セルに複数行のデータがある場合、指定行だけ参照することはできますか?
2.セルに入力されたパスが読み取り専用のフォルダかどうか調べることはできますか?
よろしくお願いします。
226:デフォルトの名無しさん
09/07/28 07:49:41
>>225
1については、セルの折り返しでなく改行入力ならば、改行をカウントして文字列抜き出す
2はFSO使えばおk
227:デフォルトの名無しさん
09/07/28 10:02:18
Excel2003 XPです。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
で渡されるTargetが連続した複数のセル範囲である場合、行を1行に
変更する処理を行いたいのですが、とりあえず力技で以下のように
しています。
myRange1 = Target.Address
myRange2 = myRange1
If InStr(myRange1, ":") Then
myRange = Split(myRange1, "$")
myRange2 = myRange(1) & myRange(2) & myRange(3) & Left(myRange(2), Len(myRange(2)) - 1)
End If
要は"$"で列行列行に分割して文字列を作り直しているのですが、
何とも見難いのでもっとスマートなコマンドやテクニックは無いでしょうか?
よろしくお願いします。
228:デフォルトの名無しさん
09/07/28 10:36:53
>>215
ありがとうございます!
すばらしくスマートです。
229:デフォルトの名無しさん
09/07/28 12:20:58
>>227
とりあえず$記号をまとめて消したいなら
myRange2 = Replace(Target.Address, "$", "")
あと、そのプログラムにはバグがあるよ。
選択された領域が2つ以上に分かれて離れていた場合、2つ目以降がすべて消えたり
$記号が残ったりする。
それよりも、セルが1個の時と複数の時を区別する意味がわかんないし、
$を消す理由もよくわからん。普通はTargetはそのまま使うもんだし。
たぶん、他の部分でもカンチガイしてる可能性が高い。
何がやりたいのか全部書いてみ?
230:227
09/07/28 13:27:12
>229
よく読んでください。
$をまとめて消したい訳ではありません。
連続領域の最上位行が対象ですので離れていようがバグりません。
>何がやりたいのか全部書いてみ?
>227の通りです。
231:デフォルトの名無しさん
09/07/28 13:35:49
>>227
データ解析の色分けで同じようなことをやったことがありますが
$を探して無理やりやった記憶があります。
今でも勉強中の身ですのでその程度の知識しかありません。
SPLITで配列に入れて結合し直すのは感心しました。
無駄レス失礼。
232:デフォルトの名無しさん
09/07/28 13:59:52
>>229
よく読めば>>227さんの言ってることくらいわかるはずだろ!
二度と質問者様の手を煩わせることのないようにな!
あと分かりやすく説明するんだぞ!!
(・д・)
233:デフォルトの名無しさん
09/07/28 14:09:26
俺の頭が悪いのかなあ
「行を1行に変更する」の意味がどうもわからん
じゃあ変更する前の「1行じゃなかった行」ってどういう状態のことだろ
234:22
09/07/28 14:27:27
dim header as range
set header = target.rows(1)
235:デフォルトの名無しさん
09/07/28 14:28:12
う、変な名前が・・・
236:デフォルトの名無しさん
09/07/28 15:42:54
>>233
奇遇だな、俺もわからないんだ
237:デフォルトの名無しさん
09/07/28 15:56:24
わからないなら書き込まないでくださいね
238:デフォルトの名無しさん
09/07/28 16:14:20
>>227
具体的な例を出してないのが悪いな
例えば$A$3:$E$6が選択されてたらどうしたいんだ?
239:デフォルトの名無しさん
09/07/28 16:32:41
>>237
そうだな、なんで解らないってレスが付いてるかも理解出来ないやつは書き込み禁止にすべきなんだよな
240:デフォルトの名無しさん
09/07/28 17:04:07
>>227
そのプログラム、Target.Addressが"$A$1,$C$3:$D$4"の時、
myRange2は"A1,C1"という結果になるんだけど、本当にこれでいいの?
241:デフォルトの名無しさん
09/07/28 17:13:21
まさかと思うけど…
1行にしたいってこういうこと?
Set myRange2 = Target.Resize(1)
242:デフォルトの名無しさん
09/07/28 17:28:21
myRange2は範囲を示す文字列だから
myRange2 = Replace(Target.Resize(1).Address, "$", "")
じゃないか?
$を消す必要があるかどうかは不明だが
ちゃんと説明してもらえそうにないんで、とりあえず。
243:デフォルトの名無しさん
09/07/28 17:30:30
実は文字列に変換する必要はなかった、に一票
たぶん>>241で正解だと思
244:227
09/07/28 17:31:34
>233
>236
>238
現状のコードまで書いてるのに・・・
>240
そのケースは想定しておりませんでした。
ご指摘ありがとうございます。
変な流れになってますので出直します。
失礼しました。
245:227
09/07/28 17:36:06
>241
それです。
Resizeがありましたね。
ありがとうございました。
246:デフォルトの名無しさん
09/07/28 17:53:30
現状のコードってあんた、>>240の例にもあるように
そのコードが理解不能な結果を出してんだから答えようがないじゃん
ちなみにCtrl+クリックで離れたセル領域を選択すると
Resizeでエラー出るよ
247:227
09/07/28 17:58:01
>246
>233,236,238の問いには充分かと思いますが?
またResizeでエラーがでるのは承知しております。
>229でとんちんかんなレスをされていた方でしょうか?
いずれにせよ不毛ですのでこの辺で失礼します。
248:デフォルトの名無しさん
09/07/28 18:42:48
>>247
ほんと変な流れになってるよね、なんでかわからないけどkkwr
ちゃんとした質問kkwrだったし、口調も丁寧kkwrなのに・・・
多分タイミングが悪かったんじゃないかな・・・また何かあったらその時はきちんとしたレスが付くといいねkkbk
249:231です
09/07/28 20:20:23
そうか、RANGEのままサイズ変更できるんだ。
何で>>227が絡まれてるか分からんけど自分の勉強になりました。
250:デフォルトの名無しさん
09/07/28 21:14:36
OS:XP、EXCEL2003 を使っています。
こちらのコードを実行すると(0 2)、(0.1 1.9)...(1.8 0.2)、(1.9 0.1)と出力されます。
最後に出力させると思われる(2 0)が出力されません。
小数処理の関係かと思うのですが、どなたか詳しい方
解説いただきたくよろしくお願いいたします。
Sub test()
Dim a As Double
Dim b As Double
For a = 0 To 2 Step 0.1
b = Round(2 - a, 1)
Debug.Print a & vbTab & b
Next
End Sub
251:デフォルトの名無しさん
09/07/28 21:48:48
>>250
演算誤差詳しくないけれど
Excelの0.1は厳密な0.1じゃないからループ21回目でfor文の終了条件の2を越えてるんじゃね?
252:デフォルトの名無しさん
09/07/28 21:52:15
>>250
浮動小数点の問題ね
As Double を As Currency にしてみたら・・どうなるかな!
253:デフォルトの名無しさん
09/07/28 22:11:06
四捨五入せずに
For a = 0 To 2 Step 0.1
b = 2 - a
Debug.Print a, b
Next
でやってみ。誤差が見えるよ。
あとPrintメソッドで「 , 」を使うとTabの働きをする。これ豆知識な
254:デフォルトの名無しさん
09/07/28 22:20:08
通貨型 (Currency)
通貨型 (Currency) の変数は、64 ビット (8 バイト) の変数です。
整数形式で表され、10,000 倍されて整数として記憶された、15 桁の整数部分と 4 桁の小数部分を持つ固定小数点数です。
-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 の範囲の値をとります。通貨型の型宣言文字は、アット マーク (@) です。
通貨型 (Currency) は、金額に関連する計算に役立つデータ型です。また、固定小数点を含む計算にも役立ちます。
255:250
09/07/28 23:14:54
>>251-254
試してみて0.1ステップだと誤差で21回目に2より
少しだけ大きな値になってしまうことが理解できました。
Printメソッドでの「 , 」も勉強になりました。
通貨型でも期待通りの動作をすることを確認できました。
こういった誤差に強い型だとわかりました。
ご回答ありがとうございました。
256:デフォルトの名無しさん
09/07/29 00:14:45
応用は利かないけど、こうするな
For a = 0 To 20 Step 1
b = ( 20 - a ) / 10
257:デフォルトの名無しさん
09/07/29 00:21:19
> あとPrintメソッドで「 , 」を使うとTabの働きをする。これ豆知識な
豆知識ではなく基礎知識じゃね?
;で区切ると結合になって、末尾に;入れると改行されないのとセットで
258:デフォルトの名無しさん
09/07/29 10:09:22
メインのSubで動的配列を
Dim A() As String
Dim B() As Long
Redim A(10)
Redim B(10)
と宣言して別のルーチンで配列の中身をいじりたい時
ルーチンの呼び出しと呼び出し側の指定はどう書いたら良いですか?
配列操作 A(), B()
private sub 配列操作(ByRef A() As String, ByRef B() As Long)
な感じでしょうか、それとも
配列操作 A, B
private sub 配列操作(ByRef A As String, ByRef B As Long)
な感じでしょうか
259:デフォルトの名無しさん
09/07/29 11:05:06
>>258
配列は自動的にByRefになるので省略できます。逆にByValは指定できません。
Call 配列操作(A(), B())
Private Sub 配列操作(A() As String, B() As Long)
260:デフォルトの名無しさん
09/07/29 11:23:33
()は必要なんですね、ありがとうございます。
261:デフォルトの名無しさん
09/07/29 11:50:09
>>259
おい、嘘つくな。
262:デフォルトの名無しさん
09/07/29 11:53:36
直後にすみません、もうひとつひっかかってしまいました。
Split関数で文字列をAというVariant型の配列に格納した場合、この変数は
配列操作 A
Private Sub 配列操作(A As Variant)
とすれば配列を維持したままByRefで渡せるんでしょうか?
263:デフォルトの名無しさん
09/07/29 12:12:18
自分で実験すれば済むことをここで聞くか?
264:デフォルトの名無しさん
09/07/29 13:37:55
聞けばわかるのにわざわざコード組むか?
なんだろ
どちらも真理だ
265:デフォルトの名無しさん
09/07/29 14:31:15
わかったら終わりなの?結局コードは書かなくていいの?
宿題?
266:デフォルトの名無しさん
09/07/29 14:37:35
>聞けばわかるのにわざわざコード組むか?
ただの疑問なら聞けば済むだろうが
ここで出る質問のほとんどは最終的に組まないと終わらないだろ?
まぁ実験の仕方がわからないって場合は仕方ないかも知れんが
267:デフォルトの名無しさん
09/07/29 15:44:29
結局コード組むんだから間違ってるかも知れない面倒はやりたくないのだよ!
268:デフォルトの名無しさん
09/07/29 15:55:18
いきなり成功するより、いっぺん間違えた方が身に付くし
理解が深まって応用がきくようになる
269:デフォルトの名無しさん
09/07/29 16:59:34
それは当然
だが結果しか望まない者もいるのだよ・・・
270:デフォルトの名無しさん
09/07/29 17:18:10
Sub test()
Dim V() As Variant
ReDim V(10)
V(0) = "自分で調べろ"
VVV V
End Sub
Private Sub VVV(V As Variant)
MsgBox V(0)
End Sub
271:デフォルトの名無しさん
09/07/29 17:57:12
>>270
そのコードは冗長的だな
今後の保守のためにもこうすべき
Sub test()
略
V(0) = "ググレ"
略
272:デフォルトの名無しさん
09/07/29 18:04:34
>>271
そのコードは冗長的だな
今後の保守のためにもこうすべき
ググレ
273:デフォルトの名無しさん
09/07/29 18:37:56
で、このスレの存在価値も無くなりましたとさ チャンチャン
274:デフォルトの名無しさん
09/07/29 18:43:57
ではこういうのは
Sub b()
Dim myStr As String
Dim myMsg As String
Dim i As Long
Do
myStr = Mid(Rnd(), 3, 14)
If myStr = "718571858269" Then Exit Do
sleep 1
Loop
For i = 1 To 12 Step 2
myMsg = myMsg + Chr(Mid(myStr, i, i + 1))
Next
Debug.Print myMsg
End Sub
>273
そもそも質問するスレだしな
答えたくないなら答えなければいいだけ・・・でもある
275:デフォルトの名無しさん
09/07/29 18:55:03
桁が足りないな
素直に
for ri = 0 to 5
Randomize
rndStr(i) = mid(rnd()3,2)
next
276:デフォルトの名無しさん
09/07/29 19:55:37
ワークシート関数を眺めていて、気になったのですが、
countif(range,"<100")
のように、第2引数が文字列型(?)のように見えます。
試しに、
dim str as string
str = "<100"
msgbox 10 & str '← 10<100 と計算をさせたい。= true の結果を出したい。
と組んだのですが、
結果は 10<100 と文字列で表現されるだけでした。
引数に含まれる演算子をそのまま読み込ませる方法はありますでしょうか。
なにとぞよろしくお願いします。
277:デフォルトの名無しさん
09/07/29 20:20:41
それをやるのはevaluate()だが、お前が本当にやりたいのはworksheetfunction()じゃないか?
278:デフォルトの名無しさん
09/07/29 20:48:18
str = "<100"
MsgBox CBool(Val(10 & str))
279:デフォルトの名無しさん
09/07/29 20:52:22
つまらん
280:デフォルトの名無しさん
09/07/29 20:52:34
sumif関数について質問です。
検索条件を2つ指定する場合はどのようにしたらいいのでしょうか?
A列にある「あ」という文字とB列にある「い」という文字があるときの
C列にある数値の合計。
よろしくお願いします。
281:デフォルトの名無しさん
09/07/29 21:00:45
>>280
ここはvbaの質問スレだけどvbaの回答でいいのか?
(なんとなくスレ違いっぽい文章に見えたので念のため確認)
282:デフォルトの名無しさん
09/07/29 22:51:02
>>277
いや、ワークシート関数をVBAで使うって話ではなくて、
例えば、countif だと条件2個はネストしないと出来ないので、
それを1つの関数で出来るようにユーザー定義関数を作ろうと思ったのです。
その時に、ワークシートの countif は、第2引数に文字列で条件を入れてるのに、
それをダイレクトに演算式に代入出来てる事を疑問に思いまして。
283:デフォルトの名無しさん
09/07/29 22:59:55
そうならそうと最初から言え馬鹿
284:デフォルトの名無しさん
09/07/29 23:00:54
私の政策はブレてません。
285:デフォルトの名無しさん
09/07/30 05:32:07
馬鹿ではないでしょ。読めば分かるし。
>282
Rangeオブジェクトのように、セル範囲を" "で囲んであるものも有りますよね。
これはVBAがコードをコンパイルする時に、区別しやすくするためだと思います。
なので必ず文字列として機能している訳ではないです。
最終的にはマシン語で動く訳ですから。
286:デフォルトの名無しさん
09/07/30 06:24:27
VBAはコンパイルはしないだろ
287:デフォルトの名無しさん
09/07/30 07:35:20
メニュー > デバッグ > VBAProject のコンパイル
288:デフォルトの名無しさん
09/07/30 07:41:11
そういう表記だとしてもコンパイルじゃないよね?
コンパイルの意味わかってる?
289:デフォルトの名無しさん
09/07/30 07:42:52
機械語に訳すとならったが、ちがうのか?
290:デフォルトの名無しさん
09/07/30 07:51:58
そうだね。
それでVBAは機械語に訳した実行ファイルを作るのかい?
291:デフォルトの名無しさん
09/07/30 07:53:31
VBAはコンパイラじゃなくて、インタプリタだろ?
292:デフォルトの名無しさん
09/07/30 09:02:19
VBAはインタプリタ言語でもあり、コンパイル言語でもある
293:デフォルトの名無しさん
09/07/30 10:04:31
アセンブラのほうが好みだわ
294:デフォルトの名無しさん
09/07/30 10:31:03
機械語を吐くのは「狭義の」コンパイル。工業高校レベルの回答。
「Pコードマシン」でぐぐれ。
295:デフォルトの名無しさん
09/07/30 13:08:27
Excel2007のVBE、インテリセンスが効かないんだけど何か設定がいるの?
296:デフォルトの名無しさん
09/07/30 13:10:25
ああ、オブジェクトの種類によって効かないやつがあるのか
Rangeならいけるわ
297:デフォルトの名無しさん
09/07/30 19:10:58
すみません、ご助言お願いいたします。
OS:Vista、Excel:2007
コンパイルを実行すると
”プロシージャの呼び出し、または引数が不正です”と表記されます。
この際、黄色い帯で示されるエラー部分が、
Public Function Zn(CZn, X, W, b, K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11)
Zn = 2 * (CZn - X - K3 * b * X - K4 * b ^ 2 * X - K5 * b ^ 3 * X - K6 * b ^ 4 * X - 2 * K7 * b * X ^ 2 - K8 * X * W - K9 * X * W ^ 2 - K10 * X * W ^ 3 - K11 * X * W ^ 4) / _
(K1 * X + ((K1 * X) ^ 2 + 4 * K2 * X * (CZn - X - K3 * b * X - K4 * b ^ 2 * X - K5 * b ^ 3 * X - K6 * b ^ 4 * X - 2 * K7 * b * X ^ 2 _
- K8 * W * X - K9 * X * W ^ 2 - K10 * X * W ^ 3 - K11 * X * W ^ 4)) ^ 0.5)
End Function
のZnの式の部分です。
色々考えたのですが原因がわからず、試しに、上手くいく類似のプログラムの
Znを代入してみたところ、エラーは出ませんでした。
代用したZnの式は
Zn = 2 * (CZn - X - K3 * b * X - K4 * b ^ 2 * X - K5 * b ^ 3 * X - K6 * b ^ 4 * X - 2 * K7 * b * X ^ 2 - K8 * X * W - K9 * X * W ^ 2) / _
(K1 * X + ((K1 * X) ^ 2 + 4 * K2 * X * (CZn - X - K3 * b * X - K4 * b ^ 2 * X - K5 * b ^ 3 * X - K6 * b ^ 4 * X - 2 * K7 * b * X ^ 2 _
- K8 * W * X - K9 * X * W ^ 2)) ^ 0.5)
です。
(K10とK12の項を削除したものです)
最初のZn式がエラーを示す原因等、ご助言お願いいたします。
298:デフォルトの名無しさん
09/07/30 19:48:59
0.5
299:デフォルトの名無しさん
09/07/30 20:09:56
^ 0.5
300:デフォルトの名無しさん
09/07/30 20:15:46
>>298
>>299
早速のご助言ありがとうございます。
0.5とは、最後のですよね。
ただ、エラーが出るZn式にも、出ないZn式にも含まれているのですが・・・?
301:デフォルトの名無しさん
09/07/30 20:28:09
そのエクセルほしいな
2kしかもっていないけど、基本的に^は整数しか出来ない
Zn = Application.Power(~~ ,0.5)
で代用
302:デフォルトの名無しさん
09/07/30 20:38:13
>>301
細かいけど前に「2 *」が抜けてないか?
303:302
09/07/30 20:40:41
不足指摘してるのもまだ不足してたな
さすがにそこまで応用力のないやつはいないか
304:297
09/07/30 20:46:40
>>301
ありがとうございます!
恥ずかしながら、301さんのスレを見て初めてVBAでワークシート関数の利用が
出来ることを知りました。。。
ほしいというのは、やはりここに書いただけではエラーの理由の解明が
難しいということでしょうか?
305:デフォルトの名無しさん
09/07/30 21:08:48
いや、全部確固内に記述しちゃえばよかろ
306:297
09/07/30 21:46:24
アドバイス頂いた方法でやってみたのですが、だめでした
最初のZnの式を
Zn = 2 * (CZn - X - K3 * b * X - K4 * b ^ 2 * X - K5 * b ^ 3 * X - K6 * b ^ 4 * X - 2 * K7 * b * X ^ 2 - K8 * X * W - K9 * X * W ^ 2 - K10 * X * W ^ 3 - K11 * X * W ^ 4) / _
(K1 * X + Application.WorksheetFunction.Power(((K1 * X) ^ 2 + 4 * K2 * X * (CZn - X - K3 * b * X - K4 * b ^ 2 * X - K5 * b ^ 3 * X - K6 * b ^ 4 * X - 2 * K7 * b * X ^ 2 _
- K8 * W * X - K9 * X * W ^ 2 - K10 * X * W ^ 3 - K11 * X * W ^ 4)), 0.5))
としたのですが、
「worksheetFunctionクラスのPowerプロパティを取得できません」
とのことです。。。
307:デフォルトの名無しさん
09/07/30 22:01:33
いろいろ変えてみたら
308:デフォルトの名無しさん
09/07/30 22:24:23
これなら通るんだよね。
Sub test()
Debug.Print 2 * Zn(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) ^ 0.5
End Sub
Public Function Zn(CZn, X, W, b, K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11)
Zn = (CZn - X - K3 * b * X - K4 * b ^ 2 * X - K5 * b ^ 3 * X - K6 * b ^ 4 * X - 2 * K7 * b * X ^ 2 - K8 * X * W - K9 * X * W ^ 2 - K10 * X * W ^ 3 - K11 * X * W ^ 4) / _
(K1 * X + ((K1 * X) ^ 2 + 4 * K2 * X * (CZn - X - K3 * b * X - K4 * b ^ 2 * X - K5 * b ^ 3 * X - K6 * b ^ 4 * X - 2 * K7 * b * X ^ 2 _
- K8 * W * X - K9 * X * W ^ 2 - K10 * X * W ^ 3 - K11 * X * W ^ 4)))
End Function
309:デフォルトの名無しさん
09/07/31 00:02:27
Excel.Range("Sheet1!$A$1").Find(What:="")
What:= ←ここに255文字以上入れると、動かんのだが。
310:デフォルトの名無しさん
09/07/31 00:36:05
Sub test()
Dim HashedData
Set HashedData = CreateObject("CAPICOM.HashedData")
HashedData.Algorithm = CAPICOM_HASH_ALGORITHM_SHA1
HashedData.Hash "abc123あいう"
MsgBox HashedData.Value
End Sub
暗号化プログラムを作っているのですが、予定では
「f95439120bf5c5d2b962cbe3a530199226f1ed2e」
と出る予定だったはずなのに違う値が出て来るヽ(`Д´)ノ
311:デフォルトの名無しさん
09/07/31 01:21:08
>>310
半角のみと全角のみで確認
312:デフォルトの名無しさん
09/07/31 07:04:59
Excelを勉強したくてスレ検索しました
ここがヒットしました。普通のExcelとExcel VBAとの違いはなんですか?
エクセルとは、プログラムしたエクセルに同じ動作を繰り返させるものだとホームページで読みました。
313:デフォルトの名無しさん
09/07/31 07:24:10
>>312
>普通のExcelとExcel VBAとの違い
比較する対象ではありません。
ExcelはExcel VBAを含みます。
しかし、例外もあり、含まないExcelもあります。
>エクセルとは、プログラムしたエクセルに同じ動作を繰り返させるもの
再帰的な定義ですね。
その「ホームページ」には「プログラムしたエクセル」の定義は書いてありましたか?
314:デフォルトの名無しさん
09/07/31 07:41:40
暗号化なんてやったことないわ
315:デフォルトの名無しさん
09/07/31 09:58:31
>>297
Functionの最初に
Debug.Print CZn; X; W; b; K1; K2; K3; K4; K5; K6; K7; K8; K9; K10; K11
ってのを追加して、エラーが出た時のパラメータを教えて
316:デフォルトの名無しさん
09/07/31 12:36:30
>>297
マイナスの平方根をとろうとしてる
実数解を期待してるなら、式かパラメータかどっちかがおかしい
317:デフォルトの名無しさん
09/07/31 14:06:05
Excel2003使用
sheet1にある表のB列に「特定」があれば、その行をコピーして
sheet2の2行目から下へ順番に貼り付けたいのですが、
sheet2への貼り付けがうまくいきません。
Rend = Range("c65536").End(xlUp).Row
For i = 7 To Rend
If Range("b" & i) = "特定" Then
Worksheets("sheet1").Rows(i).Select
Selection.Rows.Copy
Worksheets("sheet2").Rows(i).PasteSpecial
End If
Next
Worksheets("sheet2").Rows(i).PasteSpecialの変数(i)を
Rend2=Range("a2").end(xldown).offset(1,0)を作って
それを当てはめてもうまくいきません。
解決方法を教えてください
318:デフォルトの名無しさん
09/07/31 14:46:12
なにがどううまく行かないのかと
シート2のセルをカウントする変数を組み込めばいいんじゃね
319:317
09/07/31 15:19:14
>>272
ありがとうございます。^^
おかげさまで解決しました。
320:デフォルトの名無しさん
09/07/31 16:17:05
【回答は】Excel VBA質問スルナ Part13【ググレ】
321:デフォルトの名無しさん
09/07/31 20:03:47
>>317
おそらく、sheet2をアクティブにしていないから
322:デフォルトの名無しさん
09/08/01 07:56:11
すいません。
一般的な関数(例えばsinなど)では
EXCELのセル上で 『 =sin( 』を入力すると
入力セルの近くに『 SIN(数値) 』というクイックヒントがでます。
しかしVBAでユーザー定義関数をつくり、
同様にセル上で作成した関数を入力してもクイックヒントが出てきません。
どのようにすれば自作の関数でもクイックヒントがでるようになるのでしょうか。
教えてください。
Excel2003、WindowsXPです。
323:デフォルトの名無しさん
09/08/01 08:50:04
ヒントはヒントとして定義しなきゃ出ないよ
Functipnプロシージャを書いただけじゃ、関数と引数を定義しただけだ
とはいえ、Excelでユーザー定義関数のヒントを定義するのは面倒なので
「関数の引数」ダイアログを使う方法をオススメする
こちらは定義というか宣言した引数がそのまま出てくる
324:デフォルトの名無しさん
09/08/01 13:32:00
WindowsXP
Excel2000で作っています。
url = "http://・・・/a.html"
Workbooks.Open Filename:=url
という形で、社内のイントラネット上のhtmlファイルをブックとして開きたいのですが、
インターネットのファイルや、PC内のファイルは開けるのに
イントラネット上のファイルは開けません。
なにか、特別な認証が必要なのでしょうか?
325:デフォルトの名無しさん
09/08/01 18:02:08
社内イントラ上のhtmlファイルの参照を、http://・・・としてるの?
それだと開くわけないよね。
326:デフォルトの名無しさん
09/08/01 18:46:15
んなわけなかろ
いや端末アドレスがそうなってるなら問題ないだろ
327:デフォルトの名無しさん
09/08/01 19:07:40
IEや他のブラウザでurl = "http://・・・/a.html"が開けるかどうかだね
328:324
09/08/02 00:05:27
みなさんありがとうございます。
IEなどのブラウザでは開けます。
ちなみに、イントラネットのファイルのアドレスは
URLリンク(192.168.1.10)~/~.html
みたいにIPアドレスになってます。
329:デフォルトの名無しさん
09/08/02 22:32:07
cells(x,y)=""
cells(x,y)=Empty
の違いってなんでしょうか?
330:デフォルトの名無しさん
09/08/03 03:28:45
>>329
EmptyはVariant型で「変数が初期化されていない」という意味の特殊な値。
"" はString型で長さが0の文字列。ただしCellsに代入した場合は自動的にEmptyに変換されるので
結果は同じになる。
331:322
09/08/03 05:41:14
>>323
ありがとうございます。
「関数の引数」ダイアログ理解しました。
しかしできることなら、やはりヒントを定義したいのですが
その場合はどのような方法でやればいいのでしょうか?
332:デフォルトの名無しさん
09/08/03 06:37:59
君には無理だ。やめておけ。
333:デフォルトの名無しさん
09/08/03 14:57:23
シートを保存する時に書式を含む値のみを保存しているのですが、条件付き書式も
通常の書式に変換(&削除)したいのですが、何か良い方法がありますでしょうか?
334:デフォルトの名無しさん
09/08/03 17:31:03
>>333
新規のシートに
はりた
335:デフォルトの名無しさん
09/08/03 17:32:32
新規のシートに
貼りつけて保存すればいんじゃね
336:デフォルトの名無しさん
09/08/03 19:54:43
OS -> Windows Vista
Excel Office2007
ある文字列をカウントする関数Function()を作ってみたけど
参照しているセルの値が変わっても自動計算されません。
なぜでしょうか?
Excelの自動計算はONにしてます。
また、マクロも有効になっています。
数式バーにカーソルを合わせてEnterキーを押すと
そのセルだけが更新されます。