アレルギー対策、自宅でできる効果的な方法とは?

VLOOKUP関数で別ファイルのシートを参照する場合、「'D:\・・・\[book1.xlsx]Sheet1'!」のように
ファイル名部分がフルパスになりますが、この部分を変数のように別セルに入力することはできないでしょうか?
マクロなどでファイルのパスを取得して、参照先を変更できるようにしたいのです。
御教授よろしくお願いします。

A 回答 (2件)

INDIRECTとか使えば行けると思います

    • good
    • 0

ファイルパス名や参照セル値などをいくつかのセルに分割で記入して、


それを文字結合して生成・引用することは可能です。
そのようにすれば、式自体を変えることなく、引用セルの記載内容の変更で可能になります。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

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

Q【VBA】IF文 複数(ネスト)の時の処理について

こんにちは。
if文についておしえてください。
以下のようなマクロがあるとします。

変数 tensuuに-1をいれて実行すると①→②のように動作し「入力エラー」と表示されます。
tensuuに120を入れて実行すると①´→②´の順に動作し「入力エラー1」と表示されます。

どして、-1のときは入力エラー1にはいかず入力エラーにいくのでしょうか?
120のときは入力エラーにはいかず入力エラー1にいくのでしょうか?

動きがよくわかりません。
IF文とELSEはどういう紐づけがされているのでしょうか?

よろしくおねがいいたします。
   
Sub t()
tensuu = -1
If tensuu >= 0 Then '①
If tensuu <= 100 Then '①´
If tensuu >= 80 Then
MsgBox "合格"
Else
MsgBox "不合格"
End If
Else
MsgBox "入力エラー1" '②´
End If
Else
MsgBox "入力エラー" '②
End If
End Sub

こんにちは。
if文についておしえてください。
以下のようなマクロがあるとします。

変数 tensuuに-1をいれて実行すると①→②のように動作し「入力エラー」と表示されます。
tensuuに120を入れて実行すると①´→②´の順に動作し「入力エラー1」と表示されます。

どして、-1のときは入力エラー1にはいかず入力エラーにいくのでしょうか?
120のときは入力エラーにはいかず入力エラー1にいくのでしょうか?

動きがよくわかりません。
IF文とELSEはどういう紐づけがされているのでしょうか?

よろし...続きを読む

Aベストアンサー

If 〜 Then 〜 Else 〜 End If
で1セットです。

ネスト(入れ子)になったIF文というのは、 Then 〜 とか Else 〜 の〜の部分にIf文がくるものです。
ですから、外のIfを越えてしまうことはありません。
よって、一番内側から見ていけば、構造がはっきりします。


一番内側から見ます。

If tensuu >= 80 Then
MsgBox "合格"
Else
MsgBox "不合格"
End If

が1セットです。
これを 「文1」とすると元のプログラムは

If tensuu >= 0 Then '①
If tensuu <= 100 Then '①´
「文1」
Else
MsgBox "入力エラー1" '②´
End If
Else
MsgBox "入力エラー" '②
End If

となります。この状態で「一番内側」を見ると

If tensuu <= 100 Then '①´
「文1」
Else
MsgBox "入力エラー1" '②´
End If
です。これを「文2」とすると

If tensuu >= 0 Then '①
「文2」
Else
MsgBox "入力エラー" '②
End If


余談ですが
この例の場合、外側2つは、判定内容と処理とが離れてしまい、見辛いのは確かです。
if 条件 Then A Else B は if not条件 Then B Else A と同じ、ということから、Thenでの処理とElseでの処理を入れかえれば、
条件の直ぐ下の処理が来るので、見易さが格段によくなります。

If tensuu < 0 Then '① ' tensuu<0 は not (tensuu>=0)と同じ
MsgBox "入力エラー" '②
ElseIf tensuu > 100 Then '①´
MsgBox "入力エラー1" '②´
ElseIf tensuu >= 80 Then
MsgBox "合格"
Else
MsgBox "不合格"
End If ' ElseIfで継いでいるので、ネストにはなっていない

If 〜 Then 〜 Else 〜 End If
で1セットです。

ネスト(入れ子)になったIF文というのは、 Then 〜 とか Else 〜 の〜の部分にIf文がくるものです。
ですから、外のIfを越えてしまうことはありません。
よって、一番内側から見ていけば、構造がはっきりします。


一番内側から見ます。

If tensuu >= 80 Then
MsgBox "合格"
Else
MsgBox "不合格"
End If

が1セットです。
これを 「文1」とすると元のプログラムは

If tensuu >= 0 Then '①
If tensuu <= 100 Then '①´
「文1」
Else
MsgBox "入力エラー1" '②´
...続きを読む

QEXCEL VBAでVLOOKUPを実行するとFALSEなのに、おかしな数字をもってきてしまいます。

EXCEL VBA 超初心者です。
以下のマクロを作成しました。VLOOKUPを使って、SHEET2にあるデータから、同じ№であるなら、SHEET1のE列に売上を持ってくるようにしたはずなのですが、一部うまく作動できずに困っています。
E17の黄色く塗りつぶした箇所ですが、SHEET2に№1523のデータがないので、0になるはずが、何故か№1515の値を持ってきてしまいます。
以下のマクロを実行した後、F列にVLOOKUPの関数を当ててみたところ、発覚しました。
E15やE22の緑の箇所は、データがないので、0になっているのでOKなのに、何故一部おかしい数値をもってくるのかわかりません。300くらいのデータの内、10件くらいは、おかしい数値をもってきてしまっており、結局VLOOKUPの関数を後から使って、データを修正するという手間になってしまっています。
マクロのどこがおかしいのでしょうか?
On Error Resume Nextの使い方が間違っていますか?
VLOOKUPでFALSEにしてあるのに訳が分からずおて上げ状態です。

わかりにくくて申し訳ありませんが、どなたか教えてください。
どうぞ宜しくお願い致します。

Sub 売上マクロ()

Dim i As Long
Dim Uriage As Long: Uriage = 0
Dim MyNum As Long
Dim MyData As Range

Set MyData = Worksheets(2).Range("A1").CurrentRegion

For i = 2 To Worksheets(1).Range("A1").End(xlDown).Row

MyNum = Worksheets(1).Cells(i, 3).Value

On Error Resume Next
Uriage = Application.WorksheetFunction.VLookup(MyNum, MyData, 3, False)
On Error GoTo 0
Worksheets(1).Cells(i, 5).Value = Uriage

Next i

End Sub

EXCEL VBA 超初心者です。
以下のマクロを作成しました。VLOOKUPを使って、SHEET2にあるデータから、同じ№であるなら、SHEET1のE列に売上を持ってくるようにしたはずなのですが、一部うまく作動できずに困っています。
E17の黄色く塗りつぶした箇所ですが、SHEET2に№1523のデータがないので、0になるはずが、何故か№1515の値を持ってきてしまいます。
以下のマクロを実行した後、F列にVLOOKUPの関数を当ててみたところ、発覚しました。
E15やE22の緑の箇所は、データがないので、0になっているのでOKなのに、...続きを読む

Aベストアンサー

本マクロでの状態ではVLOOKUPでエラー発生時(#N/Aのケース)で、そのまま続行しています。
そうすると、エラー発生時、Uriageにはなにもセットされない為、前回の値が残ります。
VLOOKUPの直前でUriageをクリアしてください。
----------------------------------
On Error Resume Next
Uriage = 0 '・・・①
Uriage = Application.WorksheetFunction.VLookup(MyNum, MyData, 3, False)
On Error GoTo 0
----------------------------------
①を追加してください。

Q最も高い身長を表示するプログラム

5人分の身長から最も高い身長を表示するプログラムをつくったのですが、エラーがでて実行できません。改善すべきところを教えてください。お願いします。
int main(void)
{
double a[5], max = 0;
int i;

for (i = 1; i <= 5; i++)
{
a[i] = 0;
}
printf("数値を5つ入力してください。\n");

for (i = 1; i <= 5; i++)
{
scanf("%lf", &a[i]);
}

for (i = 1; i <= 5; i++)
{
if (a[i] > max)
max = a[i];
}

printf("最も高い身長は%fです\n", max);

return 0;
}

Aベストアンサー

double a[5] ;
と宣言したら、安全に使えるのは a[0] 〜 a[4] です。

なので、このプログラムを安全なものにするなら
・double a[5]はそのまま、 i=0;i<5;i++ にして、 i=0〜4 の範囲で使う
・「i = 1; i <= 5; i++は変えない」 のなら
 ・ i=1〜5を、 0〜4 に対応させて使う
   単純明快なのは、 a[i-1] とすること
 ・double a[5+1] と宣言して、a[5] を安全に使えるようにする。
   a[0] が無駄になるけど気にしない

Qコピーのvba分かりません

For n = 8 To gyo
If Cells(n, 1) <> "" Then
Cells(6, 1) = ""
Rows("5:6").Select
Selection.Copy
Rows(n, n + 1).Select
Selection.Insert Shift:=xlDown
End If
n = n + 1
Next n
マクロ初心者で、基礎が分かってません。読まれれば、分かられると思いますが、1列目の8行目から行を見ていって、数字が入っていれば、1列目6行目に入っている文字を消して、5、6行目をコピーして、数字の見つかった行とその次の行に5、6行目を挿入コピーし次に行きなさいと書いたつもりですが、Rows(n, n + 1).Selectで動かないように思われます。gyoはgyo = Cells(Rows.Count, 9).End(xlUp).Rowとし、Dim gyo as longと変数宣言してます。nもDim n as longと変数宣言しました。5、6行目には文字の入った結合セルがたくさんあります。Cells(6, 1) = ""は1回すれば良いので、本来はこの位置ではないと思いますが。

For n = 8 To gyo
If Cells(n, 1) <> "" Then
Cells(6, 1) = ""
Rows("5:6").Select
Selection.Copy
Rows(n, n + 1).Select
Selection.Insert Shift:=xlDown
End If
n = n + 1
Next n
マクロ初心者で、基礎が分かってません。読まれれば、分かられると思いますが、1列目の8行目から行を見ていって、数字が入っていれば、1列目6行目に入っている文字を消して、5、6行目をコピーして、数字の見つかった行とその次の行に5、6行目を挿入コピーし次に行きなさいと書いたつもりですが、Rows(n, n + 1)...続きを読む

Aベストアンサー

>Rows("5:6")
これと
>Rows(n, n + 1)
これは、書き方が違っている事はわかりますか?

上は文字列、下は数値になってます。
よって文字列にするため

Rows(n & ":" & n + 1) が同じ書き方になりますね。

でも挿入なら

Rows(n).Select

でいけなかったかな?

QVBA教えてください

以下のようにテキストファイルに記入されている文字列をエクセルに抽出したいのですが
なかなか思うようにいきません。

<テキストデータ>
項 A B C D
1 40
2 30
3 20

<エクセルに抽出したいデータ>
1 40
2 30
3 20


どなたかお詳しい方いらっしゃいましたら教えて頂けると幸いです。

Aベストアンサー

大変遅くなりました。以下のような感じはいかがでしょうか?
---------------------------------------------------------------------------------
Sub Sample()
Dim 対象ファイル As String
Dim 行データ As String
Dim 位置 As Long
Dim 対象位置 As Long
Dim 文字数 As Long
Dim 対象 As Boolean
Dim 行 As Long
Dim 比較文字 As String
Dim 数字 As String
対象ファイル = Application.GetOpenFilename("テキスト ファイル,*.txt")
If 対象ファイル = "False" Then Exit Sub
Open 対象ファイル For Input As #1
Do Until EOF(1)
Line Input #1, 行データ
If 対象 Then
If 対象位置 > Len(行データ) Then 対象 = False
If Mid(行データ, 1, 1) < "0" Then 対象 = False
If Mid(行データ, 1, 1) > "9" Then 対象 = False
If Mid(行データ, 対象位置, 1) < "0" Then 対象 = False
If Mid(行データ, 対象位置, 1) > "9" Then 対象 = False
Else
比較文字 = ""
For 位置 = 1 To Len(行データ)
If Mid(行データ, 位置, 1) <> " " Then
比較文字 = 比較文字 & Mid(行データ, 位置, 1)
If Mid(行データ, 位置, 1) = "D" Then 対象位置 = 位置
End If
Next
End If
If 対象 Then
行 = 行 + 1
数字 = ""
For 位置 = 1 To 対象位置
If Mid(行データ, 位置, 1) < "0" Then Exit For
If Mid(行データ, 位置, 1) > "9" Then Exit For
数字 = 数字 & Mid(行データ, 位置, 1)
Next
Cells(行, 1).Value = 数字
数字 = ""
For 位置 = 対象位置 To Len(行データ)
If Mid(行データ, 位置, 1) < "0" Then Exit For
If Mid(行データ, 位置, 1) > "9" Then Exit For
数字 = 数字 & Mid(行データ, 位置, 1)
Next
Cells(行, 2).Value = 数字
Else
If 比較文字 = "ABCD" Then 対象 = True
For 位置 = 1 To Len(行データ)
If Mid(行データ, 位置, 1) = "D" Then 対象位置 = 位置
Next
End If
Loop
Close #1
End Sub
---------------------------------------------------------------------------------

大変遅くなりました。以下のような感じはいかがでしょうか?
---------------------------------------------------------------------------------
Sub Sample()
Dim 対象ファイル As String
Dim 行データ As String
Dim 位置 As Long
Dim 対象位置 As Long
Dim 文字数 As Long
Dim 対象 As Boolean
Dim 行 As Long
Dim 比較文字 As String
Dim 数字 As String
対象ファイル = Application.GetOpenFilename("テキスト ファイル,*.txt")
If 対象ファイル = "False" Then Exit Sub
Open 対象ファイル For Inp...続きを読む

Qテキストファイルの途中行から読み込む方法について

こんにちは
テキストファイルの1から2行目をのぞき、3行目からPCへよむといったことは
かのうなのでしょうか?全部よむことはできたのですが、特定の行を指定してなど
読み込む方法がありましたらおしえてください。
宜しくおねがいいたします。

Aベストアンサー

テキストの最後が改行で終わっている場合uboundを-1しますが
そうでない場合は-1しなくてもいいですね

set fs = CreateObject("Scripting.FileSystemObject")
set f1=fs.OpenTextFile("x.txt")
allLine=f1.readALL
lines=split(allLine,vbcrlf)
j=""
for i=3 to ubound(lines)
j=j&vbcrlf&i
next
msgbox j


j=j&vbcrlf&i→j=j&i
とすれば当然改行は入りません

Qvbsで、以下のことは可能でしょうか。 よろしく、お願いします。 業務システムから、デスクトップ上の

vbsで、以下のことは可能でしょうか。
よろしく、お願いします。

業務システムから、デスクトップ上の決まったフォルダに数十のcsvが出力されます。ただし、数字のファイル名です。※日付+時間です。

上記のそれぞれのcsvのA1セルとB1セルに入力されている単語を組合わせて、ファイル名にする様にリネームすることは、可能でしょうか?

例えば、A1セルにはりんご、B1セルにりらと入力されてたら、りんごりら.csvという、ファイル名にリネーム。

どうか、教えていただけますようにお願い致します。

Aベストアンサー

一応動作確認はしましたがデバッグまではしておりません。
CSV ファイルは Shift-JIS で書かれており、1行目の 1列目と 2列目の文字がファイル名として利用可能であることが条件です。

Const ForReading = 1

Dim fso ' As ScriptingFileSystemObject
Dim targetFiles ' As Scripting.Files
Dim aFile ' As Scripting.File

Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set targetFiles = fso.GetFolder("E:\work").Files ' フォルダーの場所は適宜変更

´対象フォルダー内のすべてのファイルについてループ
Foe Each aFile In targetFiles
  ' 拡張子が csv のファイルについてのみ処理をする
  If LCase(fso.GetExtensionName(aFile)) = "csv" Then
    ’CSV ファイルを開いて 1行目だけを読み込み、カンマで分けて 1列目と 2列目の文字を使ってファイル名を生成し、CSV ファイルを閉じる
    Dim ts ' As Scripting.TextStream
    Set ts = fso.OpenTextFile(aFile, ForReading, False)
    
    Dim lineStringArray ' As Variant
    lineStringArray = Split(ts.ReadLine(), ",")
    
    Dim newFileName ' As String
    newFileName = lineStringArray(0) & lineStringArray(1) & ".csv"
    
    ts.Close
    Set ts = Nothing
    
    ' リネームする
    aFile.Name = newFileName
  End If
Next

一応動作確認はしましたがデバッグまではしておりません。
CSV ファイルは Shift-JIS で書かれており、1行目の 1列目と 2列目の文字がファイル名として利用可能であることが条件です。

Const ForReading = 1

Dim fso ' As ScriptingFileSystemObject
Dim targetFiles ' As Scripting.Files
Dim aFile ' As Scripting.File

Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set targetFiles = fso.GetFolder("E:\work").Files ' フォルダーの場所は適宜変更

´対象フォルダー内のすべてのファイル...続きを読む

QVBAで3の倍数の乱数を取得する

excelのVBAのことなのですが
3の倍数で整数で乱数を取得する方法がわかりません。

これがどうしてもわからなくて困ってます。
教えてください。

Aベストアンサー

60~198のの範囲の3の倍数の乱数を発生させ、A1からA1000のセルにその値を書き込んでいます。
200は3の倍数にならないので198を上限にしています。
MyRandを呼び出すと60から198の範囲の3の倍数の乱数を返します。
(あなたが実際に使うのは、MyRandだけです)
上限を201にしたいなら、66を67に変えてください。
MyRandを呼び出す前にRandomizeを1回実行してください。そうしないと毎回同じ結果が返ります。
---------------------------------
Option Explicit
Public Sub 乱数作成()
Dim i As Long
Dim r As Long
'乱数を作成しA列へ格納する(1000回分)
Randomize
For i = 1 To 1000
r = MyRand()
Cells(i, 1).Value = r
Next
End Sub

'60から198の範囲内の3の倍数の乱数を生成する。
Public Function MyRand() As Long
MyRand = Int((66 - 20 + 1) * Rnd + 20) * 3
End Function

60~198のの範囲の3の倍数の乱数を発生させ、A1からA1000のセルにその値を書き込んでいます。
200は3の倍数にならないので198を上限にしています。
MyRandを呼び出すと60から198の範囲の3の倍数の乱数を返します。
(あなたが実際に使うのは、MyRandだけです)
上限を201にしたいなら、66を67に変えてください。
MyRandを呼び出す前にRandomizeを1回実行してください。そうしないと毎回同じ結果が返ります。
---------------------------------
Option Explicit
Public Sub 乱数作成()
Dim i As Long
...続きを読む

Qユーザ定義型は定義されてません

こんばんは
実行すると「ユーザ定義型は定義されてません」と表示されます。
どなたかわかる方おしえてください。
Sub m()
Dim a As New NotesSession
・・・

End Sub

Aベストアンサー

参考になるかな?

セッションオブジェクトを作成する
https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_8.5.3/com.ibm.designer.domino.main.doc/H_ACCESSING_THE_DOMINO_OBJECTS_THROUGH_COM_CREATING.html

Q(続)エクセルでVBAを使い、時間入力10:30:45(10時30分45秒)の:コロン省略したい。

始業と終業の時間を入力し勤務時間を計算しております。
時間は時:分:秒まで入力します。
例えば始業時間はA1に8:30:25 、終業時間はB1に17:00:45と入れております。
コロン(:)を省略できるととても楽になります。8:30:25は83025と入力、17:00:45は170045と入力して、
表示にはコロンが入り、セルの書式としては時刻と認識し時間差を(時間:分:秒)と計算出来ればありがたいです。
よろしくお願い致します。

VBAを使った(時間:分)のコロンを入力しないで、かつ表示にはコロンが入り、セルの書式としては時刻と認識し時間計算が出来る例は検索できました。
下記です。 t****さんありがとうございました。
ですがそれを秒まで拡大し(時間:分:秒)に対応できるVBAに変更できず困っております。
何卒よろしくお願い致します。

-----------------------------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range) 'この行から
If Intersect(Target, Range("A:B")) Is Nothing Or Target.Count > 1 Then Exit Sub
With Target
If .Value <> "" Then
If IsNumeric(.Value) Then
If .Value < 2400 And .Value Mod 100 < 60 Then
Application.EnableEvents = False
.Value = TimeSerial(Int(.Value / 100), .Value Mod 100, 0)
.NumberFormatLocal = "h:mm"
Application.EnableEvents = True
Else
MsgBox "入力値が不正です"
.Select
.ClearContents
End If
End If
End If
End With
End Sub 'この行まで
-----------------------------------------------------------------------------

始業と終業の時間を入力し勤務時間を計算しております。
時間は時:分:秒まで入力します。
例えば始業時間はA1に8:30:25 、終業時間はB1に17:00:45と入れております。
コロン(:)を省略できるととても楽になります。8:30:25は83025と入力、17:00:45は170045と入力して、
表示にはコロンが入り、セルの書式としては時刻と認識し時間差を(時間:分:秒)と計算出来ればありがたいです。
よろしくお願い致します。

VBAを使った(時間:分)のコロンを入力しないで、かつ表示にはコロンが入り、セ...続きを読む

Aベストアンサー

変換ロジックを関数化して実装してみました。
「8:30:25」「83025」どちらの入力でも対応できているはずです。
ちなみに、2未満を入力すると日とみなし、2以上を入力すると秒とみなして表示されます(この辺はやってみて下さい)。

Private Sub Worksheet_Change(ByVal Target As Range) 'この行から
If Intersect(Target, Range("A:B")) Is Nothing Or Target.Count > 1 Then Exit Sub
With Target
If .Value <> "" Then
Application.EnableEvents = False
.Value = MyTimeValue(.Value)
If .Value = "" Then
MsgBox "入力値が不正です"
.Select
Else
.NumberFormatLocal = "[h]:mm:ss"
End If
Application.EnableEvents = True
End If
End With
End Sub 'この行まで

Function MyTimeValue(MyTime As Variant) As Variant
Dim t As Variant
Dim d As Variant
If IsNumeric(MyTime) And MyTime < 2 Then
MyTimeValue = MyTime
Exit Function
End If
On Error GoTo Fin
t = Split(Format(MyTime, "000:00:00"), ":")
d = Int(t(0) / 24)
t(0) = t(0) Mod 24
MyTimeValue = d + TimeSerial(t(0), t(1), t(2))
Fin:
End Function

変換ロジックを関数化して実装してみました。
「8:30:25」「83025」どちらの入力でも対応できているはずです。
ちなみに、2未満を入力すると日とみなし、2以上を入力すると秒とみなして表示されます(この辺はやってみて下さい)。

Private Sub Worksheet_Change(ByVal Target As Range) 'この行から
If Intersect(Target, Range("A:B")) Is Nothing Or Target.Count > 1 Then Exit Sub
With Target
If .Value <> "" Then
Application.EnableEvents = False
.Value = ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報