0%

有如下情况,给出一组条件,如何针对给出的条件进行对应的操作? 663e1479363466

=CHOOSE(MATCH(B4+C4,{5,3,2},),”是5”,”是3”,”是2”)

这里用到几个函数来看一下 CHOOSE 函数 说明 使用 index_num 返回数值参数列表中的数值。使用 CHOOSE 可以根据索引号从最多 254 个数值中选择一个。例如,如果 value1 到 value7 表示一周的 7 天,当将 1 到 7 之间的数字用作 index_num 时,则 CHOOSE 返回其中的某一天。 MATCH 函数 说明 MATCH 函数可在单元格区域 (区域:工作表上的两个或多个单元格。区域中的单元格可以相邻或不相邻。)中搜索指定项,然后返回该项在单元格区域中的相对位置。例如,如果单元格区域 A1:A3 包含值 5、25 和 38,则以下公式: =MATCH(25,A1:A3,0) 会返回数字 2,因为值 25 是单元格区域中的第二项。

现有一列数据如 dwAB_C3F_G,要求获取从单元格第二个字符开始至第一个下划线”_”中间的数据也就是wAB该怎么做呢? 53e61479362838

=MID(A3,2,FIND(“_”,A3)-2)

这里用到几个函数来看一下 MID 函数 说明 MID 返回文本字符串中从指定位置开始的特定数目的字符,该数目由用户指定。 FIND 函数 说明 函数 FIND 用于在第二个文本串中定位第一个文本串,并返回第一个文本串的起始位置的值,该值从第二个文本串的第一个字符算起。

现有一列数据如 ABCD-A-E5 ,需要获取最后一个短横线 “-”后面的数据也就是E5该怎么做呢? 4a471479361950

=TRIM(RIGHT(SUBSTITUTE(A3,”-“,REPT(“ “,50)),50))

这里用到几个函数来看一下 TRIM 函数 说明 除了单词之间的单个空格外,清除文本中所有的空格。在从其他应用程序中获取带有不规则空格的文本时,可以使用函数 TRIM。 要点 TRIM 函数设计用于清除文本中的 7 位 ASCII 空格字符(值 32)。在 Unicode 字符集中,有一个称为不间断空格字符的额外空格字符,其十进制值为 160。该字符通常在网页中用作 HTML 实体  。TRIM 函数本身不删除此不间断空格字符。 RIGHT 函数 说明 RIGHT 根据所指定的字符数返回文本字符串中最后一个或多个字符。 SUBSTITUTE 函数 说明 在文本字符串中用 new_text 替代 old_text。 REPT 函数 说明 按照给定的次数重复显示文本。可以通过函数 REPT 来不断地重复显示某一文本字符串,对单元格进行填充。

现在有这样一个需求,现一工作簿中有sheet1和sheet2两个表; sheet1表如下 4a471479295530 sheet2表如下: fb5c1479295531 我们可以看到序号这列是不重复的,这就好办了,说使用查找功能来回切换复制粘贴,如果有几百几千条的数据甚至更多这工作量可想而知。。。 现在就请我们的主角登场,那就是 HLOOKUP 查找函数: 在表格的首行或数值数组中搜索值,然后返回表格或数组中指定行的所在列中的值。 当比较值位于数据表格的首行时,如果要向下查看指定的行数,则可使用 HLOOKUP。 当比较值位于所需查找的数据的左边一列时,则可使用 VLOOKUP。 HLOOKUP 中的 H 代表“行”。 10fb1479295533

=HLOOKUP(B2,Sheet1!2:3,2,FALSE)

HLOOKUP(需要查找的值,在哪个范围内查找,显示的值属于查找范围的第几行,精确查找)

现在有这样一个需求,现一工作簿中有sheet1和sheet2两个表; sheet1表如下 fea91479292194 sheet2表如下: fb5c1479292435 我们可以看到序号这列是不重复的,这就好办了,说使用查找功能来回切换复制粘贴,如果有几百几千条的数据甚至更多这工作量可想而知。。。 现在就请我们的主角登场,那就是 VLOOKUP 查找函数: 如果需要在表格或区域中按行查找内容,可使用 VLOOKUP,它是一个查找和引用函数。例如,按部件号查找汽车部件的价格。 在这一最简单的形式中,VLOOKUP 函数表示: =VLOOKUP(要查找的值、要在其中查找值的区域、区域中包含返回值的列号、精确匹配或近似匹配 – 指定为 0/FALSE or 1/TRUE)。 10fb1479292717

=VLOOKUP(A3,Sheet1!A:B,2,FALSE)

VLOOKUP(需要查找的值,在哪个范围内查找,显示的值属于查找范围的第几列,精确查找)

在编程语言中IF均代表逻辑判断,这里也仍如此,先来看一个简单的示例 4a471479290036 上面的表格很明显用来计算指定数量商品的总额,但我们发现如果C列和D列如果没有数据的话E列所在的公式就会得出0,这样有人看着说影响整个观感,这里就可以用点小技巧将其去除,使用 IF 函数来进行实现: IF 函数是 Excel 中最常用的函数之一,它可以对值和期待值进行逻辑比较。IF 函数最简单的形式表示: 如果(内容为 True,则执行某些操作,否则就执行其他操作) 因此 IF 语句可能有两个结果。第一个结果是比较结果为 True,第二个结果是比较结果为 False。 fb5c1479290605

=IF(C12=””,””,C12*D12)

如果 C12 单元格是空值,那么公式所在单元格为空,否则显示C12单元格乘以D12单元格值的积

在使用excel中常有添加序列 1,2,3,4… … 的情况,大多数情况下都是采用先填写几个数字然后下拉填充选择序列的方式来操作。 b5231479285806 这里还可以使用函数+公式的方式来实现,这里我们需要用到 row() 这个函数,先来看下这个函数的作用: 说明 返回引用的行号。 语法 ROW([reference])ROW 函数语法具有下列参数 (参数:为操作、事件、方法、属性、函数或过程提供信息的值。): Reference 可选。需要得到其行号的单元格或单元格区域。 如果省略 reference,则假定是对函数 ROW 所在单元格的引用。 如果 reference 为一个单元格区域,并且函数 ROW 作为垂直数组 (数组:用于建立可生成多个结果或可对在行和列中排列的一组参数进行运算的单个公式。数组区域共用一个公式;数组常量是用作参数的一组常量。)输入,则函数 ROW 将以垂直数组的形式返回 reference 的行号。 Reference 不能引用多个区域。 555b1479285965

使用.NET平台所写的winform软件运行需要目标机器装有对应的Microsoft .NET Framework环境才能使用,如果未安装直接报错对使用者来说很不友好,得有一种方法来解决,最后采用了VC++编写了启动程序来对目标机器进行检测判断。
方法步骤这里从网上收集整理了下,用来判断本机 .NET 环境是否安装,如未安装则不运行 .NET 平台所写的程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
#include "stdio.h"
#include "windows.h"
#include "tchar.h"
#include "strsafe.h"
//#include "stdafx.h"
//#pragma comment (lib,"Advapi32.lib") //静态库编译下 需要 否则编译失败
//#pragma comment(lib, "Msimg32.lib") //静态库编译下 需要 否则编译失败
#pragma comment(lib, "AdvAPI32.lib") //静态库编译下 需要 否则编译失败
#pragma comment(lib, "User32.lib") //静态库编译下 需要 否则编译失败
#pragma comment(lib,"shell32.lib")

// 为避免机器编译时候出现:SDK中某些值没有被定义的情况,先定义他们。
#ifndef SM_TABLETPC
#define SM_TABLETPC 86
#endif

#ifndef SM_MEDIACENTER
#define SM_MEDIACENTER 87
#endif

// 用于检测注册表项的名称和值名称的常量
const TCHAR *g_szNetfx10RegKeyName = _T("Software\\\Microsoft\\\.NETFramework\\\Policy\\\v1.0");
const TCHAR *g_szNetfx10RegKeyValue = _T("3705");
const TCHAR *g_szNetfx10SPxMSIRegKeyName = _T("Software\\\Microsoft\\\Active Setup\\\Installed Components\\\{78705f0d - e8db - 4b2d - 8193 - 982bdda15ecd}");
const TCHAR *g_szNetfx10SPxOCMRegKeyName = _T("Software\\\Microsoft\\\Active Setup\\\Installed Components\\\{FDC11A6F - 17D1 - 48f9 - 9EA3 - 9051954BAA24}");
const TCHAR *g_szNetfx11RegKeyName = _T("Software\\\Microsoft\\\NET Framework Setup\\\NDP\\\v1.1.4322");
const TCHAR *g_szNetfx20RegKeyName = _T("Software\\\Microsoft\\\NET Framework Setup\\\NDP\\\v2.0.50727");
const TCHAR *g_szNetfx30RegKeyName = _T("Software\\\Microsoft\\\NET Framework Setup\\\NDP\\\v3.0\\\Setup");
const TCHAR *g_szNetfx30SpRegKeyName = _T("Software\\\Microsoft\\\NET Framework Setup\\\NDP\\\v3.0");
const TCHAR *g_szNetfx30RegValueName = _T("InstallSuccess");
const TCHAR *g_szNetfx35RegKeyName = _T("Software\\\Microsoft\\\NET Framework Setup\\\NDP\\\v3.5");
const TCHAR *g_szNetfx40RegKeyName = _T("SOFTWARE\\\Microsoft\\\NET Framework Setup\\\NDP\\\v4\\\Full");
const TCHAR *g_szNetfxStandardRegValueName = _T("Install");
const TCHAR *g_szNetfxStandardSPxRegValueName = _T("SP");
const TCHAR *g_szNetfxStandardVersionRegValueName = _T("Version");

// .NET Framework 3.0最终版本的版本信息
const int g_iNetfx30VersionMajor = 3;
const int g_iNetfx30VersionMinor = 0;
const int g_iNetfx30VersionBuild = 4506;
const int g_iNetfx30VersionRevision = 26;

// .NET Framework 3.5最终版本的版本信息
const int g_iNetfx35VersionMajor = 3;
const int g_iNetfx35VersionMinor = 5;
const int g_iNetfx35VersionBuild = 21022;
const int g_iNetfx35VersionRevision = 8;

// 函数原型声明
bool CheckNetfxBuildNumber(const TCHAR*, const TCHAR*, const int, const int, const int, const int);
int GetNetfx10SPLevel();
int GetNetfxSPLevel(const TCHAR*, const TCHAR*);
bool IsCurrentOSTabletMedCenter();
bool IsNetfx10Installed();
bool IsNetfx11Installed();
bool IsNetfx20Installed();
bool IsNetfx30Installed();
bool IsNetfx35Installed();
bool RegistryGetValue(HKEY, const TCHAR*, const TCHAR*, DWORD, LPBYTE, DWORD);

/******************************************************************
Function Name: 判断.NET Framework 1.0是否安装
Description: Uses the detection method recommended at
[url]http://msdn.microsoft.com/library/ms994349.aspx[/url]
to determine whether the .NET Framework 1.0 is
installed on the machine
Inputs: NONE
Results: .NET Framework 1.0已安装返回TRUE否则返回FALSE
******************************************************************/
bool IsNetfx10Installed()
{
TCHAR szRegValue[MAX_PATH];
return (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx10RegKeyName, g_szNetfx10RegKeyValue, NULL, (LPBYTE)szRegValue, MAX_PATH));
}

/******************************************************************
Function Name: 判断.NET Framework 1.1是否安装
Description: Uses the detection method recommended at
[url]http://msdn.microsoft.com/library/ms994339.aspx[/url]
to determine whether the .NET Framework 1.1 is
installed on the machine
Inputs: NONE
Results: .NET Framework 1.1已安装返回TRUE否则返回FALSE
******************************************************************/
bool IsNetfx11Installed()
{
bool bRetValue = false;
DWORD dwRegValue = 0;

if (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx11RegKeyName, g_szNetfxStandardRegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
{
if (1 == dwRegValue)
bRetValue = true;
}

return bRetValue;
}

/******************************************************************
Function Name: 判断.NET Framework 2.0是否安装
Description: Uses the detection method recommended at
[url]http://msdn.microsoft.com/library/aa480243.aspx[/url]
to determine whether the .NET Framework 2.0 is
installed on the machine
Inputs: NONE
Results: .NET Framework 2.0已安装返回TRUE否则返回FALSE
******************************************************************/
bool IsNetfx20Installed()
{
bool bRetValue = false;
DWORD dwRegValue = 0;

if (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx20RegKeyName, g_szNetfxStandardRegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
{
if (1 == dwRegValue)
bRetValue = true;
}

return bRetValue;
}

/******************************************************************
Function Name: 判断.NET Framework 3.0是否安装
Description: Uses the detection method recommended at
[url]http://msdn.microsoft.com/library/aa964979.aspx[/url]
to determine whether the .NET Framework 3.0 is
installed on the machine
Inputs: NONE
Results: .NET Framework 3.0已安装返回TRUE否则返回FALSE
******************************************************************/
bool IsNetfx30Installed()
{
bool bRetValue = false;
DWORD dwRegValue = 0;

// 检查InstallSuccess注册表值存在,等于1
if (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx30RegKeyName, g_szNetfx30RegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
{
if (1 == dwRegValue)
bRetValue = true;
}

//补充核查,检查版本列出的版本号在注册表中,是否已有预发布版的 .NET Framework 3.0 InstallSuccess值。
return (bRetValue && CheckNetfxBuildNumber(g_szNetfx30RegKeyName, g_szNetfxStandardVersionRegValueName, g_iNetfx30VersionMajor, g_iNetfx30VersionMinor, g_iNetfx30VersionBuild, g_iNetfx30VersionRevision));
}

/******************************************************************
Function Name: 判断.NET Framework 3.5是否安装
Description: Uses the detection method recommended at
[url]http://msdn.microsoft.com/library/cc160716.aspx[/url]
to determine whether the .NET Framework 3.5 is
installed on the machine
Inputs: NONE
Results: .NET Framework 3.5已安装返回TRUE否则返回FALSE
******************************************************************/
bool IsNetfx35Installed()
{
bool bRetValue = false;
DWORD dwRegValue = 0;

// 检查安装的注册表值存在,等于1
if (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx35RegKeyName, g_szNetfxStandardRegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
{
if (1 == dwRegValue)
bRetValue = true;
}

// 补充核查,检查版本列出的版本号在注册表中,是否已有预发布版的 .NET Framework 3.5 InstallSuccess值。
return (bRetValue && CheckNetfxBuildNumber(g_szNetfx35RegKeyName, g_szNetfxStandardVersionRegValueName, g_iNetfx35VersionMajor, g_iNetfx35VersionMinor, g_iNetfx35VersionBuild, g_iNetfx35VersionRevision));
}

/******************************************************************
Function Name: 判断.NET Framework 4.0是否安装
Description: Uses the detection method recommended at
[url]http://msdn.microsoft.com/library/cc160716.aspx[/url]
to determine whether the .NET Framework 4.0 is
installed on the machine
Inputs: NONE
Results: .NET Framework 4.0已安装返回TRUE否则返回FALSE
******************************************************************/
bool IsNetfx40Installed()
{
bool bRetValue = false;
DWORD dwRegValue = 0;

// 检查安装的注册表值存在,等于1
if (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx40RegKeyName, g_szNetfxStandardRegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
{
if (1 == dwRegValue)
bRetValue = true;
}

return bRetValue;
}

/******************************************************************
Function Name: 获取.NET Framework 1.0 SP 的版本
Description: Uses the detection method recommended at
[url]http://blogs.msdn.com/astebner/archive/2004/09/14/229802.aspx[/url]
to determine what service pack for the
.NET Framework 1.0 is installed on the machine
Inputs: NONE
Results: integer representing SP level for .NET Framework 1.0
******************************************************************/
int GetNetfx10SPLevel()
{
TCHAR szRegValue[MAX_PATH];
TCHAR *pszSPLevel = NULL;
int iRetValue = -1;
bool bRegistryRetVal = false;

//需要检测操作系统上注册表项SP的版本
if (IsCurrentOSTabletMedCenter())
bRegistryRetVal = RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx10SPxOCMRegKeyName, g_szNetfxStandardVersionRegValueName, NULL, (LPBYTE)szRegValue, MAX_PATH);
else
bRegistryRetVal = RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx10SPxMSIRegKeyName, g_szNetfxStandardVersionRegValueName, NULL, (LPBYTE)szRegValue, MAX_PATH);

if (bRegistryRetVal)
{
// 格式化SP版本号: #,#,#####,#
pszSPLevel = _tcsrchr(szRegValue, _T(', '));
if (NULL != pszSPLevel)
{
// 增量指针跳过逗号
pszSPLevel++;

// 转换值为整数
iRetValue = _tstoi(pszSPLevel);
}
}

return iRetValue;
}

/******************************************************************
Function Name: 获取.NET Framework SP 的版本
Description: 确定哪些已安装Service Pack的版本。 NET框架使用基于注册表检测方法的记载。 NET Framework的部署指南。
Inputs: pszNetfxRegKeyName – registry key name to use for detection
pszNetfxRegValueName – registry value to use for detection
Results: integer representing SP level for .NET Framework
******************************************************************/
int GetNetfxSPLevel(const TCHAR \*pszNetfxRegKeyName, const TCHAR \*pszNetfxRegValueName)
{
DWORD dwRegValue = 0;

if (RegistryGetValue(HKEY_LOCAL_MACHINE, pszNetfxRegKeyName, pszNetfxRegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
{
return (int)dwRegValue;
}

// 从注册表检索 .NET框架未安装或有某种错误的数据
return -1;
}

/******************************************************************
Function Name: 获取.NET Framework 编译版本
Description: 从注册表检索 .NET Framework 的版本号,验证这不是一个预发布版本号
Inputs: NONE
Results: true if the build number in the registry is greater
than or equal to the passed in version; false otherwise
******************************************************************/
bool CheckNetfxBuildNumber(const TCHAR \*pszNetfxRegKeyName, const TCHAR \*pszNetfxRegKeyValue, const int iRequestedVersionMajor, const int iRequestedVersionMinor, const int iRequestedVersionBuild, const int iRequestedVersionRevision)
{
TCHAR szRegValue[MAX_PATH];
TCHAR *pszToken = NULL;
TCHAR *pszNextToken = NULL;
int iVersionPartCounter = 0;
int iRegistryVersionMajor = 0;
int iRegistryVersionMinor = 0;
int iRegistryVersionBuild = 0;
int iRegistryVersionRevision = 0;
bool bRegistryRetVal = false;

// 尝试建立一些注册表值
bRegistryRetVal = RegistryGetValue(HKEY_LOCAL_MACHINE, pszNetfxRegKeyName, pszNetfxRegKeyValue, NULL, (LPBYTE)szRegValue, MAX_PATH);

if (bRegistryRetVal)
{
// 此注册表值应的格式#.#.#####.##.尝试解析4部分版本浏览
pszToken = _tcstok_s(szRegValue, _T("."), &pszNextToken);
while (NULL != pszToken)
{
iVersionPartCounter++;

switch (iVersionPartCounter)
{
case 1:
// 转换主要版本为整数

iRegistryVersionMajor = _tstoi(pszToken);
break;
case 2:
// 转换次要版本值为整数
iRegistryVersionMinor = _tstoi(pszToken);
break;
case 3:
// 转换编译版本值为整数
iRegistryVersionBuild = _tstoi(pszToken);
break;
case 4:
// 转换版本号值为整数
iRegistryVersionRevision = _tstoi(pszToken);
break;
default:
break;

}

// 获取其它部分的版本号
pszToken = _tcstok_s(NULL, _T("."), &pszNextToken);
}
}

// Compare the version number retrieved from the registry with
// the version number of the final release of the .NET Framework 3.0
//从注册表中检索最后发布的 .NET Framework 3.0 的版本号码,比较版本号码
if (iRegistryVersionMajor > iRequestedVersionMajor)
{
return true;
}
else if (iRegistryVersionMajor == iRequestedVersionMajor)
{
if (iRegistryVersionMinor > iRequestedVersionMinor)
{
return true;
}
else if (iRegistryVersionMinor == iRequestedVersionMinor)
{
if (iRegistryVersionBuild > iRequestedVersionBuild)
{
return true;
}
else if (iRegistryVersionBuild == iRequestedVersionBuild)
{
if (iRegistryVersionRevision >= iRequestedVersionRevision)
{
return true;
}
}
}
}

// If we get here, the version in the registry must be less than the
// version of the final release of the .NET Framework we are checking,
// so return false
return false;
}

bool IsCurrentOSTabletMedCenter()
{
// Use GetSystemMetrics to detect if we are on a Tablet PC or Media Center OS
return ((GetSystemMetrics(SM_TABLETPC) != 0) || (GetSystemMetrics(SM_MEDIACENTER) != 0));
}

/******************************************************************
Function Name: RegistryGetValue
Description: Get the value of a reg key
Inputs: HKEY hk – The hk of the key to retrieve
TCHAR *pszKey – Name of the key to retrieve
TCHAR *pszValue – The value that will be retrieved
DWORD dwType – The type of the value that will be retrieved
LPBYTE data – A buffer to save the retrieved data
DWORD dwSize – The size of the data retrieved
Results: true if successful, false otherwise
******************************************************************/
bool RegistryGetValue(HKEY hk, const TCHAR * pszKey, const TCHAR * pszValue, DWORD dwType, LPBYTE data, DWORD dwSize)
{
HKEY hkOpened;

// Try to open the key
if (RegOpenKeyEx(hk, pszKey, 0, KEY_READ, &hkOpened) != ERROR_SUCCESS)
{
return false;
}

// If the key was opened, try to retrieve the value
if (RegQueryValueEx(hkOpened, pszValue, 0, &dwType, (LPBYTE)data, &dwSize) != ERROR_SUCCESS)
{
RegCloseKey(hkOpened);
return false;
}

// Clean up
RegCloseKey(hkOpened);

return true;
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
int iNetfx10SPLevel = -1;
int iNetfx11SPLevel = -1;
int iNetfx20SPLevel = -1;
int iNetfx30SPLevel = -1;
int iNetfx35SPLevel = -1;
int iNetfx40SPLevel = -1;
TCHAR szMessage[MAX_PATH];

// Determine whether or not the .NET Framework
// 1.0, 1.1, 2.0 or 3.0 are installed
bool bNetfx10Installed = IsNetfx10Installed();
bool bNetfx11Installed = IsNetfx11Installed();
bool bNetfx20Installed = IsNetfx20Installed();

// The .NET Framework 3.0 is an add-in that installs
// on top of the .NET Framework 2.0. For this version
// check, validate that both 2.0 and 3.0 are installed.
bool bNetfx30Installed = (IsNetfx20Installed() && IsNetfx30Installed());

// The .NET Framework 3.5 is an add-in that installs
// on top of the .NET Framework 2.0 and 3.0. For this version
// check, validate that 2.0, 3.0 and 3.5 are installed.
bool bNetfx35Installed = (IsNetfx20Installed() && IsNetfx30Installed() && IsNetfx35Installed());

// The .NET Framework 4.0 is an add-in that installs
bool bNetfx40Installed = IsNetfx40Installed();

/\* 只需要检测4.0是否安装 注释掉别的
// If .NET Framework 1.0 is installed, get the
// service pack level
if (bNetfx10Installed)
{
iNetfx10SPLevel = GetNetfx10SPLevel();

if (iNetfx10SPLevel > 0)
_stprintf_s(szMessage, MAX_PATH, _T(".NET Framework 1.0 service pack %i is installed."), iNetfx10SPLevel);
else
_stprintf_s(szMessage, MAX_PATH, _T(".NET Framework 1.0 is installed with no service packs."));

MessageBox(NULL, szMessage, _T(".NET Framework 1.0"), MB_OK | MB_ICONINFORMATION);
}
else
{
MessageBox(NULL, _T(".NET Framework 1.0 is not installed."), _T(".NET Framework 1.0"), MB_OK | MB_ICONINFORMATION);
}

// If .NET Framework 1.1 is installed, get the
// service pack level
if (bNetfx11Installed)
{
iNetfx11SPLevel = GetNetfxSPLevel(g_szNetfx11RegKeyName, g_szNetfxStandardSPxRegValueName);

if (iNetfx11SPLevel > 0)
_stprintf_s(szMessage, MAX_PATH, _T(".NET Framework 1.1 service pack %i is installed."), iNetfx11SPLevel);
else
_stprintf_s(szMessage, MAX_PATH, _T(".NET Framework 1.1 is installed with no service packs."));

MessageBox(NULL, szMessage, _T(".NET Framework 1.1"), MB_OK | MB_ICONINFORMATION);
}
else
{
MessageBox(NULL, _T(".NET Framework 1.1 is not installed."), _T(".NET Framework 1.1"), MB_OK | MB_ICONINFORMATION);
}

// If .NET Framework 2.0 is installed, get the
// service pack level
if (bNetfx20Installed)
{
iNetfx20SPLevel = GetNetfxSPLevel(g_szNetfx20RegKeyName, g_szNetfxStandardSPxRegValueName);

if (iNetfx20SPLevel > 0)
_stprintf_s(szMessage, MAX_PATH, _T(".NET Framework 2.0 service pack %i is installed."), iNetfx20SPLevel);
else
_stprintf_s(szMessage, MAX_PATH, _T(".NET Framework 2.0 is installed with no service packs."));

MessageBox(NULL, szMessage, _T(".NET Framework 2.0"), MB_OK | MB_ICONINFORMATION);
}
else
{
MessageBox(NULL, _T(".NET Framework 2.0 is not installed."), _T(".NET Framework 2.0"), MB_OK | MB_ICONINFORMATION);
}

// If .NET Framework 3.0 is installed, get the
// service pack level
if (bNetfx30Installed)
{
iNetfx30SPLevel = GetNetfxSPLevel(g_szNetfx30SpRegKeyName, g_szNetfxStandardSPxRegValueName);

if (iNetfx30SPLevel > 0)
_stprintf_s(szMessage, MAX_PATH, _T(".NET Framework 3.0 service pack %i is installed."), iNetfx30SPLevel);
else
_stprintf_s(szMessage, MAX_PATH, _T(".NET Framework 3.0 is installed with no service packs."));

MessageBox(NULL, szMessage, _T(".NET Framework 3.0"), MB_OK | MB_ICONINFORMATION);
}
else
{
MessageBox(NULL, _T(".NET Framework 3.0 is not installed."), _T(".NET Framework 3.0"), MB_OK | MB_ICONINFORMATION);
}

// If .NET Framework 3.5 is installed, get the
// service pack level
if (bNetfx35Installed)
{
iNetfx35SPLevel = GetNetfxSPLevel(g_szNetfx35RegKeyName, g_szNetfxStandardSPxRegValueName);

if (iNetfx35SPLevel > 0)
_stprintf_s(szMessage, MAX_PATH, _T(".NET Framework 3.5 service pack %i is installed."), iNetfx35SPLevel);
else
_stprintf_s(szMessage, MAX_PATH, _T(".NET Framework 3.5 is installed with no service packs."));

MessageBox(NULL, szMessage, _T(".NET Framework 3.5"), MB_OK | MB_ICONINFORMATION);
}
else
{
MessageBox(NULL, _T(".NET Framework 3.5 is not installed."), _T(".NET Framework 3.5"), MB_OK | MB_ICONINFORMATION);
}
*/
// If .NET Framework 4.0 is installed, get the
// service pack level
if (bNetfx40Installed)
{
iNetfx40SPLevel = GetNetfxSPLevel(g_szNetfx40RegKeyName, g_szNetfxStandardSPxRegValueName);

if (iNetfx40SPLevel > 0)
_stprintf_s(szMessage, MAX_PATH, _T(".NET Framework 4.0 service pack %i is installed."), iNetfx40SPLevel);
else
_stprintf_s(szMessage, MAX_PATH, _T(".NET Framework 4.0 is installed with no service packs."));

//MessageBox(NULL, szMessage, _T(".NET Framework 4.0"), MB_OK | MB_ICONINFORMATION);
//下面开始使用 ShellExecute 运行指定程序
if (ShellExecute(NULL, "open", "erpmgr.exe", NULL, NULL, SW_SHOWNORMAL) < (HANDLE)32) {
_stprintf_s(szMessage, MAX_PATH, _T("运行中发生错误,错误代码 %d"), 2);
MessageBox(NULL, szMessage, NULL, MB_OK);
}

}
else
{
MessageBox(NULL, _T(".NET 运行环境未安装或已经损坏,请先安装或修复后再次尝试。"), _T(".NET Framework 4.0"), MB_OK | MB_ICONINFORMATION);
}

return 0;
}

visual studio 中调试下看看
8720161025165736

在 excel 中可以直接对时间格式单元格进行加减运算,比如核算公司员工的考勤和加班时间,有些时候需要取得指定的格式就是使用 text 函数 先看下excel帮助文档的 text 函数

TEXT 函数

重要: 本文是由机器翻译的,请参阅免责声明。请在 此处 中查找本文的英文版本以便参考。

说明

如果您想要合并文本和数字,如日期,可读格式到使用TEXT函数。例如,如果您有单独的单元格区域中的以下信息,您可以使用文本以创建一个有意义的句子。

72fae8ab-0dd8-4f2b-8e44-04143df72126

若要合并的示例数据

12a0d991-9caf-4142-8445-d7f68ecc5744

使用 TEXT 函数结果

技术细节

语法 文本(value,format_text) TEXT函数语法具有下列参数︰

参数名称

说明

必填。数值,计算结果为数字值或对包含数字的值的单元格引用的公式。

format_text

必填。为文本字符串用引号引起来,例如”d/yyyy”或”#,# # 0.00”数字格式。Format_text参数不区分大小写。

简单的形式 TEXT 函数显示︰

  • 文本 (”您想要应用的对应值的格式”中的您想要设置格式的值)
  • MM/DD/YY 格式,例如 03/14/12, _=TEXT(TODAY(),”MM/DD/YY”)_将返回今天的日期
  • _=”今天是”& TEXT(TODAY(),”mm/dd/yy”)_将返回”今天是 03/14/12”

注意: 组合数据被称为”串联”。 相反,如果您想要将数据拆分分离,或从单元格中提取某些数据被称为”分析”。 拆分或提取单元格的数据,请参阅以下链接。

常见问题

常见方案

假设您要合并文本和数字的值,例如”报告打印︰ 03/14/12”,或”每周收入: $66,348.72”。 您可以键入的导入到 Excel 手动,但该破坏了遇到 Excel 的目的帮您。 在下面的示例中,您将看到会发生什么情况如果您尝试执行此操作不使用TEXT函数。 在此例中,我们使用与号运算符 (&) 连接的文本字符串、 空格和值将具有_= A2 &””& B2_。 a6a97b53-7436-437b-bb95-16938118f5c7 发生了什么事?很遗憾,Excel 不知道要如何显示您的号码,以便它将它们转换为其 basest 级别,日期和时间,以及货币值的常规格式为序列号。 这是其中 TEXT 函数是非常重要,因为它允许您以强制 Excel 的值设置格式,但是您的需求。 e41b10a5-b01c-431d-8145-8a3d53c91a46 现在,我们的公式为︰

  • 单元格 C2:= A2 &””& TEXT(B2,”mm/dd/yy”) -日期格式
  • 单元格 C3: = A3 &””& TEXT (B3,”hh: mm AM/PM”) -时间格式
  • 单元格 C4: = A4 &””& TEXT(B4,”$#,###.##”) -货币格式

如何查找我格式字符串?

如果您想知道如何,您将找到格式字符串时之后,不要担心,我们将向您展示如何获取 Excel 提供给您。 如果尚未设置您的引用单元格,我们在前面的示例显示 B2,选择它,右键单击它,然后选择格式 > 单元格 > 数字,或使用CTRL + 1MAC 命令按钮图标的图像+ 1Control + 1在 Mac 上),然后选择所需的格式。 在这种情况下,Excel 会显示 B2,已格式化为日期 > 03/04/12 或”mm/dd/yy”格式。 接下来,选择自定义选项,您将看到 Excel 具有放在类型框中选中的格式。 在此例中,您不需要担心”; @”字符串,它是只是一个占位符,Excel 将不会关注是否存在或不。 d78cc429-4d0d-4495-98b4-0d7643f7b207 现在,您需要执行所有已复制格式字符串从格式 > 单元格对话框并将其粘贴到文本的公式。 = A2 &””& TEXT(B2,”mm/dd/yy”)

注意: 当然可以使用TEXT函数若要更改单个单元格的值或单元格区域,但还没有实用的用于时您可以只需使用格式 > 单元格对话框让 Excel 为您应用所需的格式。

以下是为您的值,您就可以应用不同的编号格式的一些示例。 我们不串联与任何值,这些是只需示例,以便您可以查看操作中的各种格式字符串。

下面是一个计算迟到早退的例子

8720161020145227

下面是一个计算上班时长的例子

8720161020150450

在 excel 中有些时候进行除法计算时需要得到整数部分可以使用 int 函数来实现 来看下 excel 的帮助文档

INT 函数

本文介绍 Microsoft Excel 中 INT 函数的公式语法和用法。

说明

将数字向下舍入到最接近的整数。

语法

Int( number ) INT 函数语法具有下列参数:

  • Number 必需。 需要进行向下舍入取整的实数。

示例

复制下表中的示例数据,然后将其粘贴进新的 Excel 工作表的 A1 单元格中。要使公式显示结果,请选中它们,按 F2,然后按 Enter。如果需要,可调整列宽以查看所有数据。

数据

19.5

公式

说明

结果

=INT(8.9)

将 8.9 向下舍入到最接近的整数

8

=INT(-8.9)

将 -8.9 向下舍入到最接近的整数。 向下舍入负数会朝着远离 0 的方向将数字舍入。

-9

=A2-INT(A2)

返回单元格 A2 中正实数的小数部分

0.5

8720161020144238