[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 04/22 19:53 / Filesize : 149 KB / Number-of Response : 514
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA質問スレ Part12



1 名前:デフォルトの名無しさん mailto:sage [2009/07/14(火) 19:07:54 ]
ExcelのVBAに関する質問スレです

前スレ pc12.2ch.net/test/read.cgi/tech/1241885130/

★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)

35 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 18:01:32 ]
カウンタ変数に一票

36 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 19:53:10 ]
エクセル2003で、VBAでワークシート関数としてMID関数は使えますか?
「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」って出てしまうんですけど

37 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 19:57:12 ]
>30
質問:
ユーザーフォームを使う必要がありますか?シートのどこかのセルに日付を入れて、
シートのどこかに置いたボタンじゃだめですか?(一応フォーム前提でちょっと検討中
ではあるけど)

コマンドボタンクリック1回で、どこまで日付を生成したらいいんですか?

それとも、コマンドボタンをクリックする都度1行ずつ下に日付を出力するんですか?
その場合は、どの行まで出力したかを記憶しておく変数の保存場所がシートのどこか
もしくはユーザーボックスのテキストボックス(日付を入れるものとは別)に書き込ん
でおく必要があります。どういう方法がいいですか?(マクロで保持できるのかな?)



38 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん [2009/07/18(土) 20:28:28 ]
>>36
i = WorksheetFunction.Mid(a, b, c)
とは
i = Mid(a, b, c)
こうかけるけど、
F2で検索してもワークシート関数としてのMidは引っかからなかった。
あえてワークシート関数として使うことは無理かと。

40 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 20:30:37 ]
>>39
!!そんなシンプルでよかったんですね
助かりました。ありがとうどざいます。

41 名前:38 [2009/07/18(土) 20:31:35 ]
読み難くて申し訳ないです。
抜けがありました。

h = Worksheets("sheet4").Range("c65536").End(xlUp).Offset(1, 0)

42 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 20:40:09 ]
>>34
できました! ありがとうございます!

Sheet名は、おっしゃる通りです。また、Sheet1, 2, 3 と書くつもりが 1, 2, 2 とやってしまいました・・・ 意図を汲んでいただき、本当に感謝しています。

ネストというのは、こういうふうに使うものなんですね。もっといろいろ精進します!

43 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 21:36:45 ]
優しいエスパーが多いな、このスレ w



44 名前:37 mailto:sage [2009/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 [2009/07/18(土) 22:08:54 ]
>>44
確認しました。
コードの意味がよく分からないので理解できるまで調べてみます。
ありがとうございました!

46 名前:30,44 mailto:sage [2009/07/18(土) 22:26:25 ]
>45
おことわり・・・当方Excel2003なので、ひょっとすると不具合がでるやもしれません。
バージョン2000と2003のVBAの機能の違いについてはよくわかりません、あしからず。

それから、テキストボックスに入力した文字列が日付として正しいかどうかはチェック
してません。
また、「月」だけを単純に増やしていくと、月末の違いで途中で「日付が正しくない」
と表示して終わる場合があります。(9月や11月に31日は存在しない)


47 名前:30 [2009/07/18(土) 22:39:03 ]
>>46
親切にどうもです。
テキストボックスは入力制限してあるので大丈夫です。
>>44のコードを理解して幅が広がれば、と思います。
ありがとうございました。

48 名前:30 [2009/07/18(土) 22:42:58 ]
>また、「月」だけを単純に増やしていくと、月末の違いで途中で「日付が正しくない」
>と表示して終わる場合があります。(9月や11月に31日は存在しない)

これ盲点でした。。
ちょっと考えてみます。

49 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 00:50:29 ]
DTPickerはVB買わないとあかんよ。

51 名前:30 [2009/07/19(日) 02:22:36 ]
>>49 ありがとうございます
なにが書いてあるのかさっぱりですが。。

なにかと都合がいいので、日付のテキストボックスを開始月と支払日でそれぞれコンボボックスで
対応するように仕様変更しました。ごめんなさい。

On Errorは使ったことがありませんでしたが、覚えたほうが良さそうですね。
>>38も含めて理解できるよう頑張ってみます。
ただ別件でまた問題が、、、折れそうです、、、

52 名前:30 mailto:sage [2009/07/19(日) 02:24:36 ]
>>38じゃなくて>>44ですね。。

53 名前:30 [2009/07/19(日) 02:39:33 ]
>>49
日付のコンボボックスを「1〜28、月末」で変更するつもりでしたが、
少しでも軽くしたいのと月末を選択したときの対応が大変なので>>49
使わせてもらうかもしれません。

ちょっと疲れたので寝ます。。



54 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 02:56:37 ]
IsDateかDateSerialでいいんじゃ?

55 名前:デフォルトの名無しさん [2009/07/19(日) 08:39:33 ]
i=1
として、ABC1.TXTというファイルを開くときに
Open "FFT1.txt"
ではなく、iを使って開けるようにしたいのですが、どんな風にファイル名を
書けばよいでしょうか。

56 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 08:43:43 ]


57 名前:55 [2009/07/19(日) 08:50:46 ]
すいません、間違ってABCをFFTと書いてました。
ありがとうございます。
Open "ABC" & i & ".txt"
でいけました。

58 名前:30,44,46 mailto:sage [2009/07/19(日) 09:25:39 ]
>30,51
月末というか、大の月・小の月対策が必要ならば
次の要件を満たすような処理を考えてみましょうか?

テキストボックスに入力した日付の「日」が翌月以降の月末に存在しない場合、
当月に限り月末を補正するが、その翌月以降には影響しない。
例 **/1/30 と入力したら **/2/28、**/3/30、・・・

59 名前:デフォルトの名無しさん [2009/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 mailto:sage [2009/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 mailto:sage [2009/07/19(日) 12:56:11 ]
ついでに:
自分は10年ほど前までは汎用機相手にCOBOLでプログラム開発してましたが、
移動で別の部署に移ってからは職場のPC相手にExcelVBAで省力化してました。
退職した今はボケ防止でExcelやOOo関係のスレに出没してます。

業務処理では日付関係のいろいろ(期間計算、新年号、2000年問題も)で苦労したので、
念のため大・小の月のことをコメントしてみたんです。

62 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 13:10:45 ]
>>60
3連休中に機能の追加は諦めました。orz
今の知識では無理なので、もう一度本を見ながら基礎から覚えていこうと思います。
>>60は参考にさせていただきます。
ありがとうございました。

対応できたら報告します。;

63 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 14:21:33 ]
>>62
>>対応できたら報告します。;

要りません。



64 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 15:05:54 ]
確かに要らないなw
半月も弄ってれば大抵誰でも出来るようになる処理だし

65 名前:37,44,46,58,61 mailto:sage [2009/07/19(日) 20:03:10 ]
>62
ユーザーフォームとかコンボボックスとか扱ってるレベルならわかってもらえると思ったんだけど・・・
自分はコンボボックスとかラジオボタンとかまだほとんど使ったことがないorz


66 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 21:14:58 ]
つーか、やりたいことがいまいち見えんw
エスパーさんまとめてくれ。

67 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 21:35:01 ]
えっと・・・いつも携帯から見てるんで控え目に発言してるんですけど・・・
大の月とかなんとか↑で話題になってるみたいですけど
月末日は「翌月」の「1日」から1を引けば簡単に出てくるものと思ってましたけど・・・
的外れな発言してたらすいませんおじゃましました・・・

68 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 22:27:41 ]
普通はそうするわな〜

69 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 22:38:36 ]
まあその方法もありなんだが、一行でやろうとすると
debug.print DateSerial(2009,12,0)
で11月の末日がでる。


70 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 22:45:03 ]
>>69
うぁお
そんな裏技が!
あまりに裏技すぎても思わぬバグがこわいけどこれは大丈夫なのかな?

71 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 22:56:32 ]
ようするに、(2009,m+1,0)で当月の末日が出るってこと。うるう年とかわざわざ考慮する必要がない。
0日が使えるのと同じで、0月とか13月も普通に「前月」「翌月」として使うことができる。
さらにマイナスも使える。-1月は前年の11月になる。

72 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 23:04:20 ]
>>71
試してみたらワークシートのDATE関数でも使えるのな(2007で実験)
さすがエロい人はいるもんだ

73 名前:37他 mailto:sage [2009/07/19(日) 23:06:20 ]
>67
その方法は知ってます。「OpenOffice.org 総合相談所 6」の420は自分なんですが、
翌月の〜ということは12月のときは1月のことになり、ややこしくなるので
ループ内は一番単純なこの方法をとりました。

>69
>DateSerial(yyyy,mm,0)という指定もアリなんですか? こちらもmmは翌月のこと
なので上と同じ理由で避けました。




74 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 23:09:02 ]
後だしみっともないからやめろよ。

75 名前:37他 mailto:sage [2009/07/19(日) 23:09:17 ]
>71
アップ前にリロードしてなかった。月の部分は1〜12限定じゃなかったんですか。


76 名前:62 [2009/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 mailto:sage [2009/07/19(日) 23:15:19 ]
あら?なんか出る幕なさそうですね。。

78 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 23:18:02 ]
>74
excel vba dateserial でググると最初に出てくる「田中亨のVBA基礎セミナー」他
いくつかみてみたけど、通常の範囲外の値を指定する裏技は見ませんでした。

よろしければ、この裏技を紹介しているウェブサイトを紹介してもらえませんか?

79 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 23:24:30 ]
ワロタ

80 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 23:28:40 ]
>>78
> よろしければ、この裏技を紹介しているウェブサイトを紹介してもらえませんか?

あなたが今いてるここですよ。
色んな知識を持って回答してる皆さんに失礼がないかもう一度このスレを最初からご覧になってはいかがです?

別に私はあなたを排除するつもりはないのでそれなりの礼節を(たかが2ちゃんだからたいしたことないです)わきまえて質問を続けて下されば嬉しいですけどね

81 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 01:08:24 ]
>>78
つか、Webにある情報だけが全てじゃないしw
実地で学んだことをここで吐き出してあげてんだよ

82 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 01:50:23 ]
>>73
> 12月のときは1月のことになり
除余(Mod)使えば良いだけじゃん

DateSerial(y + m \ 12, m Mod 12 + 1, 0)

なんでこんな簡単なことが解らないんだ?
除余(割り算の余り)や整数商なんて小学4年生くらいのレベルだろ?
向こうの回答もその部分にバグがある内容だし

83 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 02:22:56 ]
あんまゆとりをいじめてやんなよ



84 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 03:02:46 ]
>>82
ぶつくさいいながらも使いやすそうなコード教えてくれるおまい優しいなw

85 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 08:47:21 ]
vbaを使ってこんな悪いことしちゃいました、ってのがあったら教えてください

86 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 09:05:55 ]
スレ違い

87 名前:デフォルトの名無しさん [2009/07/20(月) 17:22:16 ]
winXP,excel97

ユーザーフォームに6個のオプションボタンを配置し、3つまで選択可能にしたいです
これは可能なのでしょうか?
できるなら、方法を教えてください

プロパティをいじってみたけど上手くいきませんでした



88 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 17:32:04 ]
グループ化 でぐぐれ

89 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 17:39:13 ]
・グループネームを全部違うのにして全部選択可能にする
・押された時のイベントで全部のボタン調べて3つ以上チェック入ってたらキャンセル

でどうだろう
コードはわかんね

90 名前:デフォルトの名無しさん [2009/07/20(月) 17:43:06 ]
>>87

普通はオプションボタンは、一つを押すと他の唯一あるTrueの奴が消えることになる。
たとえば、
○○●●●○
のとき、
一番左のを押すとどれをFalseにすればいいかわからないから、根本的に無理のはず。

やりたいなら、チェックボックス6個に
 Trueにしたときに、
  それをあわせてTrueが3つになったらなら
   他のFalseなチェックボックスを選択不能にする。
 Falseにしたときに、
  他のチェックボックスを選択可能にする。
的なことを書けばいいと思う。

91 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 17:46:44 ]
>>85
たとえば暇つぶしに作った業務システムが知らないうちに改修されてて、
コメントしたアニメセリフとかエロ話とか上司の悪口とかを書いてて、
しかもそれが削除されないまま全社配布されたとかそんなの?

92 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 17:48:09 ]
オプションボタンを1フレームごとに配置するとかだな?
フレームの非表示って出来たっけ

93 名前:デフォルトの名無しさん [2009/07/20(月) 18:03:36 ]
>>49 
これを使わせていただきます。
コードが1/3以下になりました。

他、レスしてくれた方もありがとうございました。



94 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 18:08:01 ]
>>92
プロパティのvisibileをfalseにすれば良いんじゃね?


95 名前:87 mailto:sage [2009/07/20(月) 18:24:56 ]
みなさんレスありがとうございます
グループ化を試してみます
無理なら>>90の案を試してみます

96 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 21:10:08 ]
コピー先のシートをactivateしてみるといんじゃね

98 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 21:28:31 ]
>>97
アクティブにするのを見落としてました・・・
ありがとうございましたm(__)m

99 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 21:38:55 ]
シートのコピーとか確かActiveでなくても普通にできた気がするから釈然としないけどそれで解決したんならいいのか・・・
Book2.xlsが開いててシート名も間違いなければそのままでなぜ駄目なのか?

100 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 23:58:26 ]
わからんがとりあえずOn Error Resume Next を外せばデバッグしやすいんじゃね

103 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 00:00:05 ]
あーわかった
Activecell.offset(-4,-43).Activat
にしてみ



104 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 00:15:04 ]
AT7からB6なら ActiveCell.Offset(-1, -44).Activate だな

105 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 00:17:38 ]
>>102
参考書に書いてあったのでよく分からないままいつも使ってたんですが
初心者はあまり使わないほうがいいんでしょうか?

>>103
>>104
ありがとうございます。RowとColumnを逆にしてたんですね。初歩的なミスで質問してしまってすみませんでした

106 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 00:26:19 ]
vbに限らずgoto系は使わんほうがいいらしいぜ

107 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 13:43:38 ]


110 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 15:27:22 ]
Excelで選択したセルの端をドラッグすると切り取りと張り付けになると思うんですけど
この機能自体を使用禁止にすることって出来ますか?

111 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 16:21:06 ]
>>108
&

112 名前:デフォルトの名無しさん [2009/07/21(火) 17:13:53 ]
すみません質問です。
C列に"abc"という文字列があった場合、その行全体を削除し
上に詰めるというマクロを組みたいのですが
どなたか教えていただけますでしょうか。
尚、オートフィルタを使わないやり方でお願い致します。


113 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 17:23:40 ]
上?
左じゃなくて?



114 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 17:28:01 ]
>>112
1.C列に文字列abcがあるなら行削除

2.配列に

115 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 17:41:30 ]
>>115
これだと2行つづいて"abc"があった場合抜けてしまわない?

オートフィルタを使った方法を教えて欲しい

118 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 17:47:51 ]
オートフィルタはabcが隠れるだけで本当に消えるわけじゃないからなあ

119 名前:デフォルトの名無しさん [2009/07/21(火) 18:11:41 ]
>>108
そんなの余裕だろうが。

SolverAdd CellRef:="$F$1", Relation:=1, FormulaText:="G(1+i)"

で一発だ。

120 名前:108 [2009/07/21(火) 19:24:43 ]
>>109,>>111
ヒントをどうもありがとうございます。
ただ、&の意味がわからないのですが、どういうことでしょうか?
$だと固定だから&にしろということでしょうか・・・?
無知ですいません。

121 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 19:30:31 ]
>>120
"$G$" & i

&は文字列の結合

122 名前:108 [2009/07/21(火) 21:36:02 ]
>>121
無事プログラムがうまく動きました!
どうもありがとうございます!

123 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 21:38:52 ]
Dim 日数 As Integer
Dim 本日 As Date

本日 = Date
日数 = DateDiff("d", "2009/7/10", "本日")

とやったところ、型が一致しませんとでます。
本日までの日数を求めたいのですがどうすればいいのでしょうか?



124 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 21:47:28 ]
>>123
"本日" w

126 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 21:47:51 ]
>>123
変数の本日にはダブルクォーテーションいらんよ
「本日」という文字列は計算できんじゃろ

127 名前:デフォルトの名無しさん mailto:sage [2009/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 mailto:sage [2009/07/21(火) 22:12:34 ]
あっコピー先の最後の「.」はいらんわな
あとクライテリアの*abc*を囲う必要があったかなかったか自信ない

129 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 22:37:38 ]
>>116
けつからやんのか。頭良いな。


130 名前:123 mailto:sage [2009/07/21(火) 22:40:21 ]
レスありがとうございます。
無事できました。>>127さんのようにしました。

131 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 00:02:50 ]
>>129

基本中の基本。
君の頭が○○なだけです。

132 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 00:21:45 ]
こんなんピボットでやれば一発だわwwwww

133 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 01:32:28 ]
>>131
おまえにいってねえからwww



134 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 18:03:46 ]
また堕ちるぞ

135 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 23:04:58 ]
>>133

ワロスw






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<149KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef