2009.12.21~2010.1.20と入力された場合、結果2
2009.4.1~2009.4.30と入力された場合、結果1
のように対象となる(足かけ月数)月数を出す方法を知りたいのです。

下記コードのように変数A、BにVariant型で入力してもらい(Variant型でないと困る理由があるので)
それをDate型に変換したり、またVariant型に戻したり(必要があり)しながら、myOpenFileNamesにMypath & MyFileを順次追加すべく進めたいのですが、Mcntを出せずにいます。
Month(B)-Month(A)では12月と1月で不具合が出るし‥
期間が3か月以上の場合もあります。
なにかシンプルなのがありそうなので半日調べたのですが解りませんでした。皆様、お助け下さいませ。

ここまで省略
'●請求対象期間の入力
A = Application.InputBox("請求対象期間(開始日)を入力してください。", "開始日", "2009.12.21", Type:=2)
If A = False Then
MsgBox " Cancel ボタンが押されました"
Exit Sub
End If
On Error GoTo OWARI3
A = CDate(Replace(A, ".", "/"))
On Error GoTo 0
B = Application.InputBox("請求対象期間(締め日)を入力してください。", "締め日", Replace(Format(DateAdd("d", -1, DateAdd("m", 1, A)), "yyyy/mm/dd"), "/", "."), Type:=2)
If B = False Then
GoTo OWARI
End If
On Error GoTo OWARI3
B = CDate(Replace(B, ".", "/"))
On Error GoTo 0
If A > B Then
MsgBox A & "~" & B & " は請求日と締め日が逆転してます。", vbOKOnly + vbCritical, "最初からやり直して下さい。"
GoTo OWARI
End If
D = B - A
msgRec = MsgBox(A & "~" & B & "分でよろしいですか?", vbOKCancel + vbQuestion, "対象は" & D + 1 & "日分です")
If msgRec = vbCancel Then
MsgBox " Cancel ボタンが押されました"
Exit Sub
End If

Mcnt = ●○○○●        ←ここを出す方法を知りたいのです。********************************

ReDim BN(1 To Mcnt)
For i = 1 To Mcnt
BN(i) = Replace(Format(DateAdd("m", i - 1, A), "yyyy/mm"), "/", ".")

Mypath = ThisWorkbook.Path & "\明細書一覧" & BN(i) & "月"
MyFile = "\明細書一覧" & BN(i) & "月.xls"
myOpenFileNames.Add (Mypath & MyFile)
Next i
以下略

A 回答 (4件)

>BNを配列にしない方法とは‥知りたいです



BN(Mcnt) を BN にするだけですが。

ただ、実際の流れが不明ですので詳しくは提示することはできません。

また、
>転記して集計するNEWBOOKを保存する際の部分(Save As ○○○)も
>締め月単月のBNで済みそうですのでおっしゃるとおり

とありますがこれなども意味が分かりません。
例えば、処理対象が2009/06/21~2009/10/20 とした場合
集計NEWBOOKを保存する時の、締め月単月、とはどの月をいうのでしょうか。


どういう集計方法をとられている不明ではありますが、
それを推測して、コードを書くとしたら

●BNは配列にしないし、
●myOpenFileNamesも使用しないでしょう。

'-------------------------------------

  Set NewBook = Workbooks.Add

Do
 Mcnt = Mcnt + 1
 BN = Replace(Format(DateAdd("m", Mcnt - 1, A), "yyyy/mm"), "/", ".")
  Mypath = ThisWorkbook.Path & "\明細書一覧" & BN & "月"
  MyFile = MyPath & "\明細書一覧" & BN & "月.xls"

    Set DataBook = Workbooks.Open(myFile)
  
  =====ここで集計処理する===

Loop Until BN >= Replace(Format(B, "yyyy/mm"), "/", ".")
 

  NewBook.SaveAs ■■■
 
'--------------------------------------

飽くまでも推測の域は出ませんので。
 

それから質問者に一言。

質問者は質問しながら自分でもちゃんと考えコードを書いているようですし、
回答があればそれを汲み取り自分自身で修正加筆をしておられるようなので、
回答する方としても回答のし甲斐があります。

が、残念なことに
質問者の提示する情報は、ケアレスミスが多いように思えます。
その結果、回答者を戸惑わせると同時にあらぬ方向へと向かわせることになります。
で、提示する情報は投稿する前に何回も確認して正確さを期すようにすることをお奨めします。
それは何よりも質問者のため、早期解決のため、になると考えます。
 
 
    • good
    • 0
この回答へのお礼

myRangeさん。すみませんでした。
締め月単月のBNというのは、単に締め月のことでした。
2009/06/21~2009/10/20の場合、変数Bの2009/10/20を2009.10のバリアント型に整形してそれを変数BNにして SaveAs ●●●の時使う予定だったので、BNを配列にしないほうが良いかなぁと思った一人言に近い書き込みでした。重ねてすみませんでした。
ご提示頂いたのコードの方がすっきりしそうです。
myOpenFileNamesは順次開き、最後に順次閉じる時用だったのですが、コレクションに順次追加しなくても、Do~Loopの中で順次Workbooks.Open(myFile)で開き、Set DataBookで登録し、転記済み時点でDataBook.Close Falseで順次閉じれるので、myOpenFileNamesのコレクションも不要。またBNもMcntの値で操作出来るので
BN(Mcnt)は今思うと恥ずかしいです。しかし、本人は気付かないでいました。あせって作ってる結果の気がします。
myRangeさんから頂いたのは、単にコードということより、すっきりしたロジックでした。くどい文章を書き込みましたが、本人の確認の意味とシンプルなロジックを教わったことに関して、大変有り難く受け取らせて頂いたことを伝えたかったからです。有難うございました。これに懲りずにまたお付き合い下さい。YOKOKAMA46

お礼日時:2009/05/17 22:15

>しかし、Format$の 「$」の意味が解りません。


Format関数やReplace関数など、文字列を扱う関数には、$が付いた関数があります。
$付き関数は文字列型の値を返し、付いていないものはバリアント型の値を返します。
例えば、文字列型変数に受ける場合は、この$付き関数を使った方が速度的にも有利とされています。
...が、今回のケースはあまり気にする事はないでしょう。
普段から、あまり意識して使い分けてるわけではないので適切ではなかったかもしれません。
参考にされるなら以下のサイトなど。
http://www.tsware.jp/labo/labo_32.htm
http://hanatyan.sakura.ne.jp/vbhlp/sonota_no1.htm
    • good
    • 0
この回答へのお礼

end-uさん。いつもお世話になります。「$」を最初に見たとき、byteタイプ?だったかな。と思い調べましたが違い、Like演算子にはなかったよなぁとか思い調べてみたのですがこれもやはり違い。結局頼ってしまいました。文字列型だったのですね。バリアント型と文字列型でメモリ容量の問題で文字列型型が有利。しかし、変換効率は元の型と置き換わってしまうかににもよるので、元が文字列型で、変換先も文字列型に変換して問題がないのなら、$をつけて行った方が有利ということなのですね。勉強させてもらいました。しかし、自分では。探せずにお手数かけました。ありがとうございました。いま、請求関係で焦りながら手探り状態です。しばらくの間OKWAVEに頻繁に出没してしまいそうですので、また助けて下さい。本当に有難うございました。YOKOKAMA46

お礼日時:2009/05/17 17:30

 


折角、開始日と終了日があるわけですから、
For~Next に拘らずに、Do~Loopを使う手もありかと。


'-------------------------------------
Do
 Mcnt = Mcnt + 1
 ReDim BN(1 To Mcnt)
 BN(Mcnt) = Replace(Format(DateAdd("m", Mcnt - 1, A), "yyyy/mm"), "/", ".")
  Mypath = ThisWorkbook.Path & "\明細書一覧" & BN(Mcnt) & "月"
  MyFile = "\明細書一覧" & BN(Mcnt) & "月.xls"
  myOpenFileNames.Add (Mypath & MyFile)
Loop Until BN(Mcnt) >= Replace(Format(B, "yyyy/mm"), "/", ".")

'---------------------------------------

それから余計なことかも知れませんが、
後で利用しないのであれば(この部分だけで使うのであれば)
変数BNをわざわざ配列変数にする必要はないと思いますが。
 

この回答への補足

myRangeさん。昨日の深夜、今日の早朝、そして今回の昼、いつもお世話になります。なんかお知り合いが増えてきてうれしい限りです。(とはいっても皆様に一方的に迷惑かけてるだけですが)
ご提示のコードで置き換え検証しました。OKです。だいぶすっきりするものですね。月の数字を追加したりしないで、そのまま使っているのですね。私のは、一旦置き換えたりしてたものですので、ごちゃついていました。
BNは元々月の変数として使ってました。(しかし過去は単月の時)
今回から複数選択となって変わりにmyOpenFileNamesを使ったので、ファイルの開く、閉じるにもmyOpenFileNames(i)で済んでしまいます。まだ手を付けてませんが、転記して集計するNEWBOOKを保存する際の部分(Save As ○○○)も締め月単月のBNで済みそうですのでおっしゃるとおりBNは配列化の必要はなさそうです。開いたファイルは、変更点がないので(読み取り専用で開いてもいい)順次myOpenFileNames(i)で閉じるだけです。
でもBNを配列にしない方法とは‥知りたいです。教えてもらえませんか?お願いします。

補足日時:2009/05/17 16:47
    • good
    • 0

こんにちは。


>2009.12.21~2010.1.20と入力された場合、結果2
>2009.4.1~2009.4.30と入力された場合、結果1
>のように対象となる(足かけ月数)月数を出す方法を...
あまり深く考えてませんが

Dim v As Date
Dim w As Date
Dim x

v = #12/21/2009#
w = #1/20/2010#
v = CDate(Format$(v, "yyyy/mm/1"))
w = CDate(Format$(w, "yyyy/mm/1"))
x = DateDiff("m", v, w) + 1
MsgBox x

こんな感じ?

この回答への補足

end-uさん。またまたありがとうございます。
DateDiff関数は知りませんでした。
またFormat関数を使い、全て1日に置き換えDateDiff関数により導き出すというのは大いに参考となりました。

実は、投稿後、今一度単純に考え直したら下記の方法
If Month(B) - Month(A) < 0 Then
MM = Month(B) + 12
を思いつき進めることが出来ていました。
これにより

MM = Month(B)
If Month(B) - Month(A) < 0 Then
MM = Month(B) + 12
End If
Mcnt = MM - Month(A) + 1
ReDim BN(1 To Mcnt)

For i = 1 To Mcnt
BN(i) = Replace(Format(DateAdd("m", i - 1, A), "yyyy/mm"), "/", ".")

Mypath = ThisWorkbook.Path & "\明細書一覧" & BN(i) & "月"
MyFile = "\明細書一覧" & BN(i) & "月.xls"
myOpenFileNames.Add (Mypath & MyFile)
Next i
としております。

しかし、Format$の 「$」の意味が解りません。この機会にもう少しだけお付き合いを頂いて教えてはもらえないでしょうか?
お願い致します。

補足日時:2009/05/17 16:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QBRICsでの英語の通用度

BRICsでの英語の通用度

こんにちは、BRICsのうち、インドは英語を公用語としていますが、残りの3ヶ国は 英語の通用度が日本と同じくらいか若干下回るのではないでしょうか? 一方、BRICsともビジネスは基本的に英語で行うとか聞いたことがありますが、ちょっと疑問です。例えば、日本でも 丸紅や伊藤忠のような大商社や パナソニックやトヨタのような日本を代表するメーカーなら いくらでも英語で対応できる人がおりますが、
例えば中堅スーパーのバイヤーや町工場の社長レベルでは期待できませんよね。 ですから、BRICsの残りの3ヶ国も日本と似たようなものだと思います。それで、結局 こっちが英語を話せても 相手の国側では通訳を用意しなければならないでしょう。そこで質問です。BRICsでの英語の通用度はどの程度なんでしょうか?

Aベストアンサー

回答は既に出てますが、個人的な経験を述べるならば、BRICsのブラジル限定ですが、
日本以上に英語は街中では通じません。
もちろん海外と取引をしている様な会社は英語話者を抱えているか、常に通訳を用意してます。
一般に英語が通じる場所と言えば、国際空港のカウンター(お世辞にも通じるとは言い難い)、国際観光ホテル(ホテルにもよるが、10ヶ国語くらい通じるホテルがリオデジャネイロに、そしてアマゾーナス州の、マナウスのホテルなど有った。
それ以外は....
ブラジルで英語が通じない最大の原因は英語圏からの移民が殆ど無い。それに比べると、西ヨーロッパ系言語(ポルトガル語は元より、フランス語、イタリア語)他にアラブ系、の移民が多いのも有ります。
そして日系移民も多いです。日本各地の奥になまりが融合した、日系人にしか理解出来ない日本語(?)が地域毎にそれぞれ存在します。
ブラジル企業とビジネスを考えるなら、日本語流暢な日系人(今時日本語流暢なブラジル人も珍しくは無い)を通訳しに仕立ててポルトガル語で対話した方が現実的かもしれません。

QIf myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, 24) = myTantou こちらについて教えていただきたいです。

myTorikomibi = Range("A2").Value
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, 4) = myTantou
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, 14) = myTantou
If myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, 24) = myTantou
For i = 1 To 3
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, i + 4) = myTorikomibi
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, i + 14) = myTorikomibi
If myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, i + 24) = myTorikomibi
Next i
マクロを編集しようとしましたところこちらが解読できづに困っています。
こちらだけとりだして実行しながら解読していますが混乱してしまっています。ご存知の方いらっしゃいましたら教えてください。Then以降がわかりません。よろしくお願いいたします。

myTorikomibi = Range("A2").Value
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, 4) = myTantou
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, 14) = myTantou
If myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, 24) = myTantou
For i = 1 To 3
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, i + 4) = myTorikomibi
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, i + 14) = myTorikomibi
If myCityBUNRUINO = 2 Then Cells...続きを読む

Aベストアンサー

こんにちは。maruru01です。

ヘルプはご覧になりましたか?
特に、Cellsについて。
Cellsは、

Cells(行番号, 列番号)

で、セルを参照します。
なので、各条件の時に、変数「myTantou」や「myTorikomibi」に格納されている値をそれらのセルに代入しているだけですが。
ただし、行番号が、

「myPrefNO + 3 - 47」
「myPrefNO + 3 - 47 - myCityNu」

などとちょっとややこしくなっていますが。
これも、変数「myPrefNO」「myCityNu」に入っている値から行番号が決まるというだけです。
例えば、
myPrefNO=60
myCityNu=2
なら、下の例は、
60+3-47-2=14
で、14行目となるということです。

Q英語の習熟度

英語の習熟度

みなさんの英語の習熟度はどれくらいでしょうか?
1 通訳クラスの会話ができる
2 日常会話ができる
3 業務文書や英語論文が書ける
4 一般的な表示が読み書きできる
5 大卒レベル
6 高卒レベル
7 知っているのはI love youだけ

複数回答可です。

Aベストアンサー

7ですが、ネイティブ並みに話せる人を英語で笑かします!!

QIf Not c Is Nothing Then ~延々処理が続く~ End If

質問というか相談というか
VBAで下記のようなコードをよく見ますし、私自身もこれで書いてます。

For i= 1 to 10
set c=Range.Find(”いろは")
If Not c Is Nothing Then


処理が続く


End If
Next i

cが見つからなかったら、さっさと次の i に進む場合の処理です。Ifの字下げがず~~っと延々続き、最後のNext iの直前でEnd If です。
・Exit For はあるのに 途中Next iは出来ない
・Goto 使って書くと「スパゲティプログラムだ」とか言われる
正直言って、上記コードとGotoスパゲティで可読性に差異があるとは思えません。何でもかんでもGotoはダメていう風潮がおかしいように思えます。

みなさんどうやって書いてますか?

Aベストアンサー

こんにちは。

>Goto 使って書くと「スパゲティプログラムだ」とか言われる
どっちかというと、今は、ネットの中で、某VBA系の専門掲示板で、他人のコードを罵る時に使う用語ですね。Goto を使ったから、スパゲティーと短絡して使うのに、その言った本人は、エラー処理ひとつ施していない隙だらけのコードだということが多いのです。「スパゲティプログラム」は、◯◯の一つ覚えの用語だと思います。

>For i= 1 to 10
>set c=Range.Find(”いろは")
>If Not c Is Nothing Then

>~
>処理が続く
>~
>
>End If
>Next i

これって、よく見るとおっしゃっていますが、ひとつ例外に、いわゆる「ブルートフォースアタック(総当り制)」のコードがありますね。それは、Goto 以外に抜け出せる方法がありませんね。「深いネストはするな」という禁を犯しているのだから、Goto 以前のものがあります。(何に使うかはご存知だと思いますし、それをとやかく言う人はいないでしょう。)

これを書き換え、再帰を使うと良いとか言う人もいるのでしょうけれども、そういうのは、知識だけで実際にやったことがない人の話だと思います。「スパゲティ」とか知らない人に、比べさせれば、再帰などを使った方法は、遅くてダメ出しされるのは目に見えています。特殊な例ですが。

ご質問で、実際の私は、内容にもよりますが、
Private flg As Boolean

Sub Main()
On Error Goto ErrHandler
For i= 1 to 10
 Call subRutine(findTxt)
 If flg Then Exit For
Next i
Exit Sub

ErrHandler:
処理
End Sub
'ここの中身はテンプレート化してあります。
Private Sub subRutine(ByVal findTxt) または、Public
'処理
End Sub

としているはずで、モジュールレベルの変数を、flg とし、サブルーチンの中に置いて、目的がかなったら、Flgは、Trueになって、ループから抜け出すようにします。

サブルーチン側では、End ステートメントを使用することさえもあります。(テンプレート化しているのは、Findメソッド、RegExpの正規表現、Sortメソッド、Dictionary とSortLists などがあります。[MZ-Tools 3.0]を使用)

GOTO は、構造化プログラムが登場した時に、排除するように言われてきたものです。古い時代の人は、GOTOに逃げたくなるのを抑えるために、「GOTO」を使うなって、肝に命じてきたのです。しかし、結局、Goto は、なくならなかったのは、一つには、ErrHandlerを使った、エラートラップのせいもあります。だから、Goto を書かないでErr.Raise (513~)で飛ばす方法がありますが、あまり使う人はいません。

ところで、
「スパゲティプログラム」という話に振られると、私は自信がありません。
読みやすさ(可読性)の対極になるものでしょうけれども、誰に対して言っているものか、ということです。私の大事にしている本の中に、アスキーの『QuickBASICプログラミング道場』(1991年)という本があります。

---引用
・本道場で推奨するプログラミングスタイル (p25~)

1.変数・定数・プロシージャーの命名法 (変数の型のサフィックスは使うな)
2.インデントを付けるべし
3.メインプロシージャは短くすべし
4.プロシージャは短くすべし
5.長いブロックはプロシージャーにすべし
6.汎用性のあるプロシージャーを作るべし
7.定数は活用すべし
8.GOTOは乱用(濫用)すべからず。●
 従来のBASICを使ってきた人の中には、GOTO文を多用する人がいるようだ。GOTO文はそのときは便利なように思うが、あとになってリストを眺めてみると、どこに飛んでいるか分からなくなることが多い。……わけがわからない最低の"スパゲティプログラム"になってしまう。
 【例】GOTO文をDOループに置き換える
----引用終わり

現代でも通用するというよりも、その言葉が生まれた時代背景がありますから、必ずしも、GOTOが問題だということではなさそうです。Goto を使わないということにこだわると、逆に墓穴を掘ることになります。

それと、DO ループにするというのは、DO ~ LOOPの間に緊張感(?)は生まれるけれども、無限ループを生み出しやすくなるのです。その頃はそれで良かったかもしれませんが、もうESCでは止まりません。今は必ずしも認められるものではありません。

それと、記録マクロを、そのままVBAプロシージャーに用いるのは、絶対にダメなのですよね。本当のスパゲティプログラムになってしまいます。ベタ書きになってしまうからで、一度、そういうコードを直してくれと言われましたが、怒りを抑えて、丁重にお断りました。

こんにちは。

>Goto 使って書くと「スパゲティプログラムだ」とか言われる
どっちかというと、今は、ネットの中で、某VBA系の専門掲示板で、他人のコードを罵る時に使う用語ですね。Goto を使ったから、スパゲティーと短絡して使うのに、その言った本人は、エラー処理ひとつ施していない隙だらけのコードだということが多いのです。「スパゲティプログラム」は、◯◯の一つ覚えの用語だと思います。

>For i= 1 to 10
>set c=Range.Find(”いろは")
>If Not c Is Nothing Then

>~
>処理が続く
>~
>
>End If
>Next...続きを読む

Q英語だけで見た難易度について。

今近畿圏の大学について調べています。

そこで1つ疑問に思ったのが、調べていた中に、大阪外国語大学は二次試験が英語と小論文ということなのですが、単純に英語だけの難易度で見て、どれくらいの難易度なのでしょうか?

外国語大学の英語の試験という事で相当難しいときくのですが、偏差値で言われるとピンとこない部分があって、例えば英語だけで見て京都大学の試験と同じぐらいとか、大阪大学の試験と同じくらいなどと説明していただけるとありがたいです。

Aベストアンサー

阪大英語レベルで解けます。神大レベルだとちょっと厳しいかな。予備校などでは外大クラスが設置されていないと阪大クラスの英語をとるように指導します。
なぜかというと、阪大も大外大も自由英作文が課されるなど問題として類似しているので対策になるからです。

Q条件付きコンパイル: #IF 1 Then と #IF 0 Then

条件付コンパイルで、
『#If 1 Then』と『#If 0 Then』の条件の違いを教えてください。


『#If ○○○=1 Then』などの場合はわかるのですが、
単に『#If 1 Then』の場合は何をもって真となるのでしょうか?

よろしくお願いいたします。

Aベストアンサー

条件式は、強制的に「True」又は「False」に解釈されます。

で、「数値」を「True」又は「False」に解釈する場合、
「0」は「False」、「0以外」は「True」になります。
(http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/vsfctcbool.asp)

つまり、
『#If 1 Then』は、「必ずTrue」=常に有効
『#If 0 Then』は、「必ずFalse」=常に無効
に成ります。

Q香港の英語の通用度について

香港は英語はどの年齢層にも通用するものなんでしょうか?
また、1997年に英国から中国に返還されたので、その分英語教育は薄まって英語の通用度が落ちたことはないのでしょうか?
ぜひお教え下さいませ。

Aベストアンサー

香港は中国とは一線を画していて,様子が全く違います。
香港では英語と広東語が公用語なので英語の通用度は高いです。
広東語と同等です。
また,テレビの影響もあって中国語の標準語も定着してきました。
最近ではホテルやお店でもある程度日本語が通じたり,
レストランでは日本語メニューを置くお店が増えてきました。

Q#If VBA7 Thenに関して

VBAを使っていて

http://blog.goo.ne.jp/mumbai/e/dc90cf94fc40baebf807f1913de4fc10

#If VBA7 Then
Debug.Print "EXCELは2010以上です。"
#Else
Debug.Print("EXCELは2007以下です。")
#End If

というように、#IFというようなものが出てきます。

これの使用方法を知りたいのですが検索して調べたところ、

https://msdn.microsoft.com/ja-jp/library/tx6yas69.aspx

このページに書かれてあるように
#があるとコンパイル時にif文の評価を行うのに対し、
#がないとif文も含めてコンパイルした後に、プログラムを実行する時にif文の評価を行う
といったことが書かれてあります。

それで試してみたのですが


#If VBA7 Then
aa=0
#Else
aa=1
#End If


というコードを実行するとaa=0が代入されます。

一方で

If VBA7 Then
aa=0
Else
aa=1
End If
というコードを実行するとVBA7がemptyになっており
aa=1が代入されます。

これはVBA7という変数がコンパイル時にのみ有効で
実行時には存在しないためだからでしょうか?

VBAを使っていて

http://blog.goo.ne.jp/mumbai/e/dc90cf94fc40baebf807f1913de4fc10

#If VBA7 Then
Debug.Print "EXCELは2010以上です。"
#Else
Debug.Print("EXCELは2007以下です。")
#End If

というように、#IFというようなものが出てきます。

これの使用方法を知りたいのですが検索して調べたところ、

https://msdn.microsoft.com/ja-jp/library/tx6yas69.aspx

このページに書かれてあるように
#があるとコンパイル時にif文の評価を行うのに対し、
#がないとif文も含...続きを読む

Aベストアンサー

少しだけですが、
#If VBA7 Then
aa=0
#Else
aa=1
#End If
の『VBA7』は条件付きコンパイル中で使える定数です。
あらかじめVBAの中に組み込まれています。

で、
If VBA7 Then
aa=0
Else
aa=1
End If
とした場合の『VBA7』は一般的な単なる変数です。

VBEでツール→オプションの編集タブにある「変数の宣言を強制する」に
チェックを入れてあると
「コンパイルエラー :変数が定義されていません」になるはずです。
でチェックを入れていない場合はVariant型として定義されますので
Empty値の初期値は、False、0、"" のいずれかになりますから
If VBA7 Then → False → aa=1 となるわけです。

Q法政大学GISの英語の難易度教えて下さい。

法政大学GISの英語の難易度教えて下さい。
早稲田教育の英語より難易度高いですか?私大文系最難関ですか?
浪人ですが、今英語の偏差値52だったら入試までにGISの英語レベルには手遅れですか?(泣)

Aベストアンサー

ここは帰国子女率7割の年もあったと聞きますが大丈夫でしょうか。偏差値52から大躍進して奇跡の合格を勝ち得たとしても、その後ついていけますか。浮きませんか。少数枠なのでサボることも逃げ出すことも容易ではないはずですが。

QIf~Thenステートメントについて

お世話になります。

マクロを作成するのに、If~Thenを使用したいのですが上手く使えません。

<例>
A列に文字・数字が入っているとき→B列に”い”、C列に”う”、D列に”え”と反映させる。
A列が空白のセルになったら→その行はすべて空白にする。
行数は50行程度の予定です。

    A      B      C      D
1   あ     い      う      え
2   空白   空白     空白    空白
3   あ     い      う      え
4   空白   空白     空白    空白

----------------------------------------------------------

数値に対して一致・大小等の条件であれば、問題なく作成できたのですが…。
私の探し方が悪いのだとは思いますが、
セルが空白か否かを判断して文字を反映させる、というのが見つけられませんでした。

関数を使えば簡単なのは承知しておりますが、その他の処理をすべてマクロで作成したので、
できれば統一させてしまいたい…と思っています。
初心者用の本を見ながら作成している初心者ですが、何卒ご教示頂けませんでしょうか?
よろしくお願いいたします。

お世話になります。

マクロを作成するのに、If~Thenを使用したいのですが上手く使えません。

<例>
A列に文字・数字が入っているとき→B列に”い”、C列に”う”、D列に”え”と反映させる。
A列が空白のセルになったら→その行はすべて空白にする。
行数は50行程度の予定です。

    A      B      C      D
1   あ     い      う      え
2   空白   空白     空白    空白
3   あ     い      う      え
4   空白   ...続きを読む

Aベストアンサー

こんな感じ
Sub ボタン1_Click()
For i = 1 To 50
If Range("A" & i).Value = "" Then
Range("B" & i).Value = ""
Range("C" & i).Value = ""
Range("D" & i).Value = ""
Range("E" & i).Value = ""
Else
Range("B" & i).Value = "い"
Range("C" & i).Value = "う"
Range("D" & i).Value = "え"
Range("E" & i).Value = "お"
End If
Next
End Sub


人気Q&Aランキング

おすすめ情報